home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 1.0 version / MF3DPC / MFPRIMTV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-07  |  91.2 KB  |  3,609 lines  |  [TEXT/dosa]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFPRIMTV.C
  4.  *
  5.  *    Function:    Handle read/write of basic types.
  6.  *
  7.  *    Version:    Metafile:    Version 1.0 3DMF files
  8.  *                Package:    Release #2 of this code
  9.  *
  10.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  11.  *                John Kelly (JRK), Duet Development Corp.
  12.  *
  13.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  14.  *
  15.  *    Change History (most recent first):
  16.  *        FB8_JRK    Segmentation
  17.  *        FB4_JRK    Parse object types we don't understand
  18.  *        Fabio    Changed file name to 8 characters
  19.  *        F3F_RWW Disable variable unsigned read/write.
  20.  *        F3A_RWW    TOC stuff works.
  21.  *        F2S_RWW    BeginGroup changes.
  22.  *        F2R_RWW    Get rid of dumb curPos field in MF3D_FileRec
  23.  *        F2E_RWW    File created.
  24.  *==============================================================================
  25.  */
  26.  
  27. #include "MFPRIMTV.H"
  28.  
  29. #include <stdio.h>            /* sprintf */
  30.  
  31. #include "MF3D.H"
  32. #include "MFERRORS.H"
  33. #include "MFINT64.H"
  34. #include "MFSYSTYP.H"
  35. #include "MFTYPES.H"
  36. #include "MFASSERT.H"
  37. #include "MFBINRD.H"
  38. #include "MFBINUTL.H"
  39. #include "MFINTOBJ.H"
  40. #include "MFLABELS.H"
  41. #include "MFMACROS.H"
  42. #include "MFMEMORY.H"
  43. #include "MFOBJTYP.H"
  44. #include "MFTEXTRD.H"
  45. #include "MFTEXTST.H"
  46. #include "MFTEXTUT.H"
  47. #include "MFTEXTWR.H"
  48.  
  49. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  50. #pragma segment __MF3D__
  51. #endif
  52.  
  53. /*==============================================================================
  54.  *    Methods structure
  55.  *==============================================================================
  56.  */
  57. struct MF3D_IOPrimitiveMethods
  58. {    /* unsigned integers */
  59.     MF3DErr        (*readUns8)        (MF3D_FilePtr metafile, MF3DUns8 *data);
  60.     MF3DErr        (*writeUns8)    (MF3D_FilePtr metafile, MF3DUns8 data);
  61.     MF3DErr        (*readUns16)    (MF3D_FilePtr metafile, MF3DUns16 *data);
  62.     MF3DErr        (*writeUns16)    (MF3D_FilePtr metafile, MF3DUns16 data);
  63.     MF3DErr        (*readUns32)    (MF3D_FilePtr metafile, MF3DUns32 *data);
  64.     MF3DErr        (*writeUns32)    (MF3D_FilePtr metafile, MF3DUns32 data);
  65.     MF3DErr        (*readUns64)    (MF3D_FilePtr metafile, MF3DUns64 *data);
  66.     MF3DErr        (*writeUns64)    (MF3D_FilePtr metafile, MF3DUns64 data);
  67.  
  68.     /* signed integers */
  69.     MF3DErr        (*readInt8)        (MF3D_FilePtr metafile, MF3DInt8 *data);
  70.     MF3DErr        (*writeInt8)    (MF3D_FilePtr metafile, MF3DInt8 data);
  71.     MF3DErr        (*readInt16)    (MF3D_FilePtr metafile, MF3DInt16 *data);
  72.     MF3DErr        (*writeInt16)    (MF3D_FilePtr metafile, MF3DInt16 data);
  73.     MF3DErr        (*readInt32)    (MF3D_FilePtr metafile, MF3DInt32 *data);
  74.     MF3DErr        (*writeInt32)    (MF3D_FilePtr metafile, MF3DInt32 data);
  75.     MF3DErr        (*readInt64)    (MF3D_FilePtr metafile, MFINT64 *data);
  76.     MF3DErr        (*writeInt64)    (MF3D_FilePtr metafile, MFINT64 data);
  77.  
  78.     /* floats */
  79.     MF3DErr        (*readFloat32)    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  80.     MF3DErr        (*writeFloat32)    (MF3D_FilePtr metafile, MF3DFloat32 data);
  81.     MF3DErr        (*readFloat64)    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  82.     MF3DErr        (*writeFloat64)    (MF3D_FilePtr metafile, MF3DFloat64 data);
  83.  
  84.     /* strings */
  85.     MF3DErr        (*readCString)    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  86.     MF3DErr        (*writeCString)    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  87.  
  88.     /* raw data */
  89.     MF3DErr        (*readRawData)    (MF3D_FilePtr metafile, MF3DSize size,
  90.                                         MF3DRawDataPtr data);
  91.     MF3DErr        (*writeRawData)    (MF3D_FilePtr metafile, MF3DSize size,
  92.                                         MF3DRawDataPtr data);
  93.     
  94.     /* enums */
  95.     MF3DErr        (*readEnum)        (MF3D_FilePtr metafile,
  96.                                         MF3D_EnumTablePtr labelID,
  97.                                         MF3DEnumData *data);
  98.     MF3DErr        (*writeEnum)    (MF3D_FilePtr metafile,
  99.                                         MF3D_EnumTablePtr labelID,
  100.                                         MF3DEnumData data);
  101.  
  102.     /* flags */
  103.     MF3DErr        (*readFlags)    (MF3D_FilePtr metafile,
  104.                                         MF3D_FlagTablePtr labelID,
  105.                                         MF3DFlagData *data);
  106.     MF3DErr        (*writeFlags)    (MF3D_FilePtr metafile,
  107.                                         MF3D_FlagTablePtr labelID,
  108.                                         MF3DFlagData data);
  109.  
  110.     /* begin/end object */
  111.     MF3DErr        (*readBegin)    (MF3D_FilePtr metafile,
  112.                                         MF3D_ObjStuffPtr *objStuff,
  113.                                         MF3DReferenceID    *refID,
  114.                                         MF3DObjType *objType);
  115.     MF3DErr        (*readEnd)        (MF3D_FilePtr metafile);
  116.     MF3DErr        (*writeBegin)    (MF3D_FilePtr metafile,
  117.                                         MF3DVoidObjPtr object,
  118.                                         MF3D_ObjStuffPtr *objStuff);
  119.     MF3DErr        (*writeEnd)        (MF3D_FilePtr metafile);
  120.  
  121.     /* object ID */
  122.     MF3DErr        (*readObjType)    (MF3D_FilePtr metafile,
  123.                                         MF3D_ObjStuffPtr *objStuff,
  124.                                         MF3DObjType *objType);
  125.     MF3DErr        (*writeObjType)    (MF3D_FilePtr metafile, MF3DVoidObjPtr object,
  126.                                         MF3D_ObjStuffPtr *objStuff);
  127.  
  128.     /* Reference label */
  129.     MF3DErr        (*readRef)        (MF3D_FilePtr metafile,
  130.                                         MF3DPositionReference *data);
  131.     MF3DErr        (*writeRef)        (MF3D_FilePtr metafile,
  132.                                         MF3D_TOCPosition data);
  133.     MF3DErr        (*writeTOCRef)    (MF3D_FilePtr metafile,
  134.                                         MF3DPositionReferencePtr data);
  135.     MF3DErr        (*writeLabel)    (MF3D_FilePtr metafile,
  136.                                         MF3DReferenceInfoPtr data,
  137.                                         MF3DBinaryFilePosition location,
  138.                                         MF3DObjType type);
  139.  
  140.     /* Preprocess */
  141.     MF3DErr        (*preprocess)    (MF3D_FilePtr metafile);
  142.  
  143.     /* Get Reference Name */
  144.     MF3DCStringPtr    (*getRefName)(MF3D_FilePtr metafile, MF3DReferenceID refID);
  145.  
  146.     /* Postprocess */
  147.     MF3DErr        (*postprocess)    (MF3D_FilePtr metafile);
  148. };
  149.  
  150. typedef struct MF3D_IOPrimitiveMethods    MF3D_IOPrimitiveMethods;
  151.  
  152. /*==============================================================================
  153.  *    Static prototypes
  154.  *==============================================================================
  155.  */
  156. /* unsigned integers */
  157. static MF3DErr    MF3D_Uns8ReadB        (MF3D_FilePtr metafile, MF3DUns8 *data);
  158. static MF3DErr    MF3D_Uns8ReadT        (MF3D_FilePtr metafile, MF3DUns8 *data);
  159.  
  160. static MF3DErr    MF3D_Uns8WriteB        (MF3D_FilePtr metafile, MF3DUns8 data);
  161. static MF3DErr    MF3D_Uns8WriteT        (MF3D_FilePtr metafile, MF3DUns8 data);
  162.  
  163. static MF3DErr    MF3D_Uns16ReadB        (MF3D_FilePtr metafile, MF3DUns16 *data);
  164. static MF3DErr    MF3D_Uns16ReadBS    (MF3D_FilePtr metafile, MF3DUns16 *data);
  165. static MF3DErr    MF3D_Uns16ReadT        (MF3D_FilePtr metafile, MF3DUns16 *data);
  166.  
  167. static MF3DErr    MF3D_Uns16WriteB    (MF3D_FilePtr metafile, MF3DUns16 data);
  168. static MF3DErr    MF3D_Uns16WriteBS    (MF3D_FilePtr metafile, MF3DUns16 data);
  169. static MF3DErr    MF3D_Uns16WriteT    (MF3D_FilePtr metafile, MF3DUns16 data);
  170.  
  171. static MF3DErr    MF3D_Uns32ReadB        (MF3D_FilePtr metafile, MF3DUns32 *data);
  172. static MF3DErr    MF3D_Uns32ReadBS    (MF3D_FilePtr metafile, MF3DUns32 *data);
  173. static MF3DErr    MF3D_Uns32ReadT        (MF3D_FilePtr metafile, MF3DUns32 *data);
  174.  
  175. static MF3DErr    MF3D_Uns32WriteB    (MF3D_FilePtr metafile, MF3DUns32 data);
  176. static MF3DErr    MF3D_Uns32WriteBS    (MF3D_FilePtr metafile, MF3DUns32 data);
  177. static MF3DErr    MF3D_Uns32WriteT    (MF3D_FilePtr metafile, MF3DUns32 data);
  178.  
  179. static MF3DErr    MF3D_Uns64ReadB        (MF3D_FilePtr metafile, MF3DUns64 *data);
  180. static MF3DErr    MF3D_Uns64ReadBS    (MF3D_FilePtr metafile, MF3DUns64 *data);
  181. static MF3DErr    MF3D_Uns64ReadT        (MF3D_FilePtr metafile, MF3DUns64 *data);
  182.  
  183. static MF3DErr    MF3D_Uns64WriteB    (MF3D_FilePtr metafile, MF3DUns64 data);
  184. static MF3DErr    MF3D_Uns64WriteBS    (MF3D_FilePtr metafile, MF3DUns64 data);
  185. static MF3DErr    MF3D_Uns64WriteT    (MF3D_FilePtr metafile, MF3DUns64 data);
  186.  
  187. static MF3DErr    MF3D_Int8ReadB        (MF3D_FilePtr metafile, MF3DInt8 *data);
  188. static MF3DErr    MF3D_Int8ReadT        (MF3D_FilePtr metafile, MF3DInt8 *data);
  189.  
  190. static MF3DErr    MF3D_Int8WriteB        (MF3D_FilePtr metafile, MF3DInt8 data);
  191. static MF3DErr    MF3D_Int8WriteT        (MF3D_FilePtr metafile, MF3DInt8 data);
  192.  
  193. static MF3DErr    MF3D_Int16ReadB        (MF3D_FilePtr metafile, MF3DInt16 *data);
  194. static MF3DErr    MF3D_Int16ReadBS    (MF3D_FilePtr metafile, MF3DInt16 *data);
  195. static MF3DErr    MF3D_Int16ReadT        (MF3D_FilePtr metafile, MF3DInt16 *data);
  196.  
  197. static MF3DErr    MF3D_Int16WriteB    (MF3D_FilePtr metafile, MF3DInt16 data);
  198. static MF3DErr    MF3D_Int16WriteBS    (MF3D_FilePtr metafile, MF3DInt16 data);
  199. static MF3DErr    MF3D_Int16WriteT    (MF3D_FilePtr metafile, MF3DInt16 data);
  200.  
  201. static MF3DErr    MF3D_Int32ReadB        (MF3D_FilePtr metafile, MF3DInt32 *data);
  202. static MF3DErr    MF3D_Int32ReadBS    (MF3D_FilePtr metafile, MF3DInt32 *data);
  203. static MF3DErr    MF3D_Int32ReadT        (MF3D_FilePtr metafile, MF3DInt32 *data);
  204.  
  205. static MF3DErr    MF3D_Int32WriteB    (MF3D_FilePtr metafile, MF3DInt32 data);
  206. static MF3DErr    MF3D_Int32WriteBS    (MF3D_FilePtr metafile, MF3DInt32 data);
  207. static MF3DErr    MF3D_Int32WriteT    (MF3D_FilePtr metafile, MF3DInt32 data);
  208.  
  209. static MF3DErr    MF3D_Int64ReadB        (MF3D_FilePtr metafile, MFINT64 *data);
  210. static MF3DErr    MF3D_Int64ReadBS    (MF3D_FilePtr metafile, MFINT64 *data);
  211. static MF3DErr    MF3D_Int64ReadT        (MF3D_FilePtr metafile, MFINT64 *data);
  212.  
  213. static MF3DErr    MF3D_Int64WriteB    (MF3D_FilePtr metafile, MFINT64 data);
  214. static MF3DErr    MF3D_Int64WriteBS    (MF3D_FilePtr metafile, MFINT64 data);
  215. static MF3DErr    MF3D_Int64WriteT    (MF3D_FilePtr metafile, MFINT64 data);
  216.  
  217. /* floats */
  218. static MF3DErr    MF3D_Float32ReadB    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  219. static MF3DErr    MF3D_Float32ReadBS    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  220. static MF3DErr    MF3D_Float32ReadT    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  221.  
  222. static MF3DErr    MF3D_Float32WriteB    (MF3D_FilePtr metafile, MF3DFloat32 data);
  223. static MF3DErr    MF3D_Float32WriteBS    (MF3D_FilePtr metafile, MF3DFloat32 data);
  224. static MF3DErr    MF3D_Float32WriteT    (MF3D_FilePtr metafile, MF3DFloat32 data);
  225.  
  226. static MF3DErr    MF3D_Float64ReadB    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  227. static MF3DErr    MF3D_Float64ReadBS    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  228. static MF3DErr    MF3D_Float64ReadT    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  229.  
  230. static MF3DErr    MF3D_Float64WriteB    (MF3D_FilePtr metafile, MF3DFloat64 data);
  231. static MF3DErr    MF3D_Float64WriteBS    (MF3D_FilePtr metafile, MF3DFloat64 data);
  232. static MF3DErr    MF3D_Float64WriteT    (MF3D_FilePtr metafile, MF3DFloat64 data);
  233.  
  234. /* strings */
  235. static MF3DErr    MF3D_CStringReadB    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  236. static MF3DErr    MF3D_CStringReadT    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  237.  
  238. static MF3DErr    MF3D_CStringWriteB    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  239. static MF3DErr    MF3D_CStringWriteT    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  240.  
  241. /* raw data */
  242. static MF3DErr    MF3D_RawDataReadB    (MF3D_FilePtr metafile, MF3DSize size,
  243.                                             MF3DRawDataPtr data);
  244. static MF3DErr    MF3D_RawDataReadT    (MF3D_FilePtr metafile, MF3DSize size,
  245.                                             MF3DRawDataPtr data);
  246.  
  247. static MF3DErr    MF3D_RawDataWriteB    (MF3D_FilePtr metafile, MF3DSize size,
  248.                                         MF3DRawDataPtr data);
  249. static MF3DErr    MF3D_RawDataWriteT    (MF3D_FilePtr metafile, MF3DSize size,
  250.                                         MF3DRawDataPtr data);
  251.     
  252. /* enums */
  253. static MF3DErr    MF3D_EnumReadB        (MF3D_FilePtr metafile,
  254.                                             MF3D_EnumTablePtr labelID,
  255.                                             MF3DEnumData *data);
  256. static MF3DErr    MF3D_EnumReadBS        (MF3D_FilePtr metafile,
  257.                                             MF3D_EnumTablePtr labelID,
  258.                                             MF3DEnumData *data);
  259. static MF3DErr    MF3D_EnumReadT        (MF3D_FilePtr metafile,
  260.                                             MF3D_EnumTablePtr labelID,
  261.                                             MF3DEnumData *data);
  262.  
  263. static MF3DErr    MF3D_EnumWriteB        (MF3D_FilePtr metafile,
  264.                                             MF3D_EnumTablePtr labelID,
  265.                                             MF3DEnumData data);
  266. static MF3DErr    MF3D_EnumWriteBS    (MF3D_FilePtr metafile,
  267.                                             MF3D_EnumTablePtr labelID,
  268.                                             MF3DEnumData data);
  269. static MF3DErr    MF3D_EnumWriteT        (MF3D_FilePtr metafile,
  270.                                             MF3D_EnumTablePtr labelID,
  271.                                             MF3DEnumData data);
  272.  
  273. /* flags */
  274. static MF3DErr    MF3D_FlagsReadB        (MF3D_FilePtr metafile,
  275.                                             MF3D_FlagTablePtr labelID,
  276.                                             MF3DFlagData *data);
  277. static MF3DErr    MF3D_FlagsReadBS    (MF3D_FilePtr metafile,
  278.                                             MF3D_FlagTablePtr labelID,
  279.                                             MF3DFlagData *data);
  280. static MF3DErr    MF3D_FlagsReadT        (MF3D_FilePtr metafile,
  281.                                             MF3D_FlagTablePtr labelID,
  282.                                             MF3DFlagData *data);
  283.  
  284. static MF3DErr    MF3D_FlagsWriteB    (MF3D_FilePtr metafile,
  285.                                             MF3D_FlagTablePtr labelID,
  286.                                             MF3DFlagData data);
  287. static MF3DErr    MF3D_FlagsWriteBS    (MF3D_FilePtr metafile,
  288.                                             MF3D_FlagTablePtr labelID,
  289.                                             MF3DFlagData data);
  290. static MF3DErr    MF3D_FlagsWriteT    (MF3D_FilePtr metafile,
  291.                                             MF3D_FlagTablePtr labelID,
  292.                                             MF3DFlagData data);
  293.  
  294. /* begin/end object */
  295. static MF3DErr    MF3D_BeginReadB        (MF3D_FilePtr metafile,
  296.                                             MF3D_ObjStuffPtr *objStuff,
  297.                                             MF3DReferenceID    *refID,
  298.                                             MF3DObjType *objType);
  299. static MF3DErr    MF3D_BeginReadT        (MF3D_FilePtr metafile,
  300.                                             MF3D_ObjStuffPtr *objStuff,
  301.                                             MF3DReferenceID    *refID,
  302.                                             MF3DObjType *objType);
  303.  
  304. static MF3DErr    MF3D_EndReadB        (MF3D_FilePtr metafile);
  305. static MF3DErr    MF3D_EndReadBS        (MF3D_FilePtr metafile);
  306. static MF3DErr    MF3D_EndReadT        (MF3D_FilePtr metafile);
  307.  
  308. static MF3DErr    MF3D_BeginWriteB    (MF3D_FilePtr metafile,
  309.                                             MF3DVoidObjPtr object,
  310.                                             MF3D_ObjStuffPtr *objStuff);
  311. static MF3DErr    MF3D_BeginWriteT    (MF3D_FilePtr metafile,
  312.                                             MF3DVoidObjPtr object,
  313.                                             MF3D_ObjStuffPtr *objStuff);
  314.  
  315. static MF3DErr    MF3D_EndWriteB        (MF3D_FilePtr metafile);
  316. static MF3DErr    MF3D_EndWriteT        (MF3D_FilePtr metafile);
  317.  
  318. /* object ID */
  319. static MF3DErr    MF3D_ObjTypeReadB    (MF3D_FilePtr metafile,
  320.                                             MF3D_ObjStuffPtr *objStuff,
  321.                                             MF3DObjType *objType);
  322. static MF3DErr    MF3D_ObjTypeReadBS    (MF3D_FilePtr metafile,
  323.                                             MF3D_ObjStuffPtr *objStuff,
  324.                                             MF3DObjType *objType);
  325. static MF3DErr    MF3D_ObjTypeReadT    (MF3D_FilePtr metafile,
  326.                                             MF3D_ObjStuffPtr *objStuff,
  327.                                             MF3DObjType *objType);
  328.  
  329. static MF3DErr    MF3D_ObjTypeWriteB    (MF3D_FilePtr metafile,
  330.                                             MF3DVoidObjPtr object,
  331.                                             MF3D_ObjStuffPtr *objStuff);
  332. static MF3DErr    MF3D_ObjTypeWriteT    (MF3D_FilePtr metafile,
  333.                                             MF3DVoidObjPtr object,
  334.                                             MF3D_ObjStuffPtr *objStuff);
  335.  
  336. /* reference label */
  337. static MF3DErr    MF3D_RefReadB        (MF3D_FilePtr metafile,
  338.                                             MF3DPositionReference *data);
  339. static MF3DErr    MF3D_RefReadT        (MF3D_FilePtr metafile,
  340.                                             MF3DPositionReference *data);
  341.  
  342. static MF3DErr    MF3D_RefWriteB        (MF3D_FilePtr metafile,
  343.                                             MF3D_TOCPosition data);
  344. static MF3DErr    MF3D_RefWriteT        (MF3D_FilePtr metafile,
  345.                                             MF3D_TOCPosition data);
  346.  
  347. static MF3DErr    MF3D_TOCRefWriteB    (MF3D_FilePtr metafile,
  348.                                             MF3DPositionReferencePtr data);
  349. static MF3DErr    MF3D_TOCRefWriteT    (MF3D_FilePtr metafile,
  350.                                             MF3DPositionReferencePtr data);
  351.  
  352. static MF3DErr    MF3D_LabelWriteB    (MF3D_FilePtr metafile,
  353.                                             MF3DReferenceInfoPtr data,
  354.                                             MF3DBinaryFilePosition location,
  355.                                             MF3DObjType type);
  356. static MF3DErr    MF3D_LabelWriteT    (MF3D_FilePtr metafile,
  357.                                             MF3DReferenceInfoPtr data,
  358.                                             MF3DBinaryFilePosition location,
  359.                                             MF3DObjType type);
  360.  
  361. /*==============================================================================
  362.  *    Static Globals
  363.  *==============================================================================
  364.  */
  365. static MF3D_IOPrimitiveMethods    gMF3D_BinaryPrimitiveMethods =
  366. {    /* integers */
  367.     MF3D_Uns8ReadB,
  368.     MF3D_Uns8WriteB,
  369.     MF3D_Uns16ReadB,
  370.     MF3D_Uns16WriteB,
  371.     MF3D_Uns32ReadB,
  372.     MF3D_Uns32WriteB,
  373.     MF3D_Uns64ReadB,
  374.     MF3D_Uns64WriteB,
  375.     MF3D_Int8ReadB,
  376.     MF3D_Int8WriteB,
  377.     MF3D_Int16ReadB,
  378.     MF3D_Int16WriteB,
  379.     MF3D_Int32ReadB,
  380.     MF3D_Int32WriteB,
  381.     MF3D_Int64ReadB,
  382.     MF3D_Int64WriteB,
  383.     /* floats */
  384.     MF3D_Float32ReadB,
  385.     MF3D_Float32WriteB,
  386.     MF3D_Float64ReadB,
  387.     MF3D_Float64WriteB,
  388.     /* strings */
  389.     MF3D_CStringReadB,
  390.     MF3D_CStringWriteB,
  391.     /* raw data */
  392.     MF3D_RawDataReadB,
  393.     MF3D_RawDataWriteB,
  394.     /* enums */
  395.     MF3D_EnumReadB,
  396.     MF3D_EnumWriteB,
  397.     /* flags */
  398.     MF3D_FlagsReadB,
  399.     MF3D_FlagsWriteB,
  400.     /* begin/end (size) */
  401.     MF3D_BeginReadB,
  402.     MF3D_EndReadB,
  403.     MF3D_BeginWriteB,
  404.     MF3D_EndWriteB,
  405.     /* object id */
  406.     MF3D_ObjTypeReadB,
  407.     MF3D_ObjTypeWriteB,
  408.     /* reference */
  409.     MF3D_RefReadB,
  410.     MF3D_RefWriteB,
  411.     MF3D_TOCRefWriteB,
  412.     MF3D_LabelWriteB,
  413.     /* preprocess */
  414.     MF3D_PreprocessBinaryFile,
  415.     /* get reference name */
  416.     MF3D_GetRefNameB,
  417.     /* postprocess */
  418.     MF3D_PostprocessBinaryFile
  419. };
  420.  
  421. static MF3D_IOPrimitiveMethods    gMF3D_BinarySwappedPrimitiveMethods =
  422. {    /* integers */
  423.     MF3D_Uns8ReadB,
  424.     MF3D_Uns8WriteB,
  425.     MF3D_Uns16ReadBS,
  426.     MF3D_Uns16WriteBS,
  427.     MF3D_Uns32ReadBS,
  428.     MF3D_Uns32WriteBS,
  429.     MF3D_Uns64ReadBS,
  430.     MF3D_Uns64WriteBS,
  431.     MF3D_Int8ReadB,
  432.     MF3D_Int8WriteB,
  433.     MF3D_Int16ReadBS,
  434.     MF3D_Int16WriteBS,
  435.     MF3D_Int32ReadBS,
  436.     MF3D_Int32WriteBS,
  437.     MF3D_Int64ReadBS,
  438.     MF3D_Int64WriteBS,
  439.     /* floats */
  440.     MF3D_Float32ReadBS,
  441.     MF3D_Float32WriteBS,
  442.     MF3D_Float64ReadBS,
  443.     MF3D_Float64WriteBS,
  444.     /* strings */
  445.     MF3D_CStringReadB,
  446.     MF3D_CStringWriteB,
  447.     /* raw data */
  448.     MF3D_RawDataReadB,
  449.     MF3D_RawDataWriteB,
  450.     /* enums */
  451.     MF3D_EnumReadBS,
  452.     MF3D_EnumWriteBS,
  453.     /* flags */
  454.     MF3D_FlagsReadBS,
  455.     MF3D_FlagsWriteBS,
  456.     /* begin/end (size) */
  457.     MF3D_BeginReadB,
  458.     MF3D_EndReadB,
  459.     MF3D_BeginWriteB,
  460.     MF3D_EndWriteB,
  461.     /* object id */
  462.     MF3D_ObjTypeReadBS,
  463.     MF3D_ObjTypeWriteB,
  464.     /* reference */
  465.     MF3D_RefReadB,
  466.     MF3D_RefWriteB,
  467.     MF3D_TOCRefWriteB,
  468.     MF3D_LabelWriteB,
  469.     /* preprocess */
  470.     MF3D_PreprocessBinaryFile,
  471.     /* get reference name */
  472.     MF3D_GetRefNameB,
  473.     /* postprocess */
  474.     MF3D_PostprocessBinaryFile
  475. };
  476.  
  477. static MF3D_IOPrimitiveMethods    gMF3D_TextPrimitiveMethods =
  478. {    /* integers */
  479.     MF3D_Uns8ReadT,
  480.     MF3D_Uns8WriteT,
  481.     MF3D_Uns16ReadT,
  482.     MF3D_Uns16WriteT,
  483.     MF3D_Uns32ReadT,
  484.     MF3D_Uns32WriteT,
  485.     MF3D_Uns64ReadT,
  486.     MF3D_Uns64WriteT,
  487.     MF3D_Int8ReadT,
  488.     MF3D_Int8WriteT,
  489.     MF3D_Int16ReadT,
  490.     MF3D_Int16WriteT,
  491.     MF3D_Int32ReadT,
  492.     MF3D_Int32WriteT,
  493.     MF3D_Int64ReadT,
  494.     MF3D_Int64WriteT,
  495.     /* floats */
  496.     MF3D_Float32ReadT,
  497.     MF3D_Float32WriteT,
  498.     MF3D_Float64ReadT,
  499.     MF3D_Float64WriteT,
  500.     /* strings */
  501.     MF3D_CStringReadT,
  502.     MF3D_CStringWriteT,
  503.     /* raw data */
  504.     MF3D_RawDataReadT,
  505.     MF3D_RawDataWriteT,
  506.     /* enums */
  507.     MF3D_EnumReadT,
  508.     MF3D_EnumWriteT,
  509.     /* flags */
  510.     MF3D_FlagsReadT,
  511.     MF3D_FlagsWriteT,
  512.     /* begin/end object */
  513.     MF3D_BeginReadT,
  514.     MF3D_EndReadT,
  515.     MF3D_BeginWriteT,
  516.     MF3D_EndWriteT,
  517.     /* object id */
  518.     MF3D_ObjTypeReadT,
  519.     MF3D_ObjTypeWriteT,
  520.     /* reference */
  521.     MF3D_RefReadT,
  522.     MF3D_RefWriteT,
  523.     MF3D_TOCRefWriteT,
  524.     MF3D_LabelWriteT,
  525.     /* preprocess */
  526.     MF3D_PreprocessTextFile,
  527.     /* get reference name */
  528.     MF3D_GetRefNameT,
  529.     /* postprocess */
  530.     MF3D_PostprocessTextFile
  531. };
  532.  
  533. static MF3DUns32    zero = 0;
  534.  
  535. /*==============================================================================
  536.  *    MF3D_GetPrimitivesAccessor
  537.  *==============================================================================
  538.  */
  539. MF3DErr
  540. MF3D_GetPrimitivesAccessor(
  541.     MF3DDataFormatEnum        inDataFormat,
  542.     MF3D_IOPrimitivesTable    *outPrimitives)
  543. {
  544.     switch(inDataFormat)
  545.     {    case kMF3DFormatBinary:
  546.             *outPrimitives = &gMF3D_BinaryPrimitiveMethods;
  547.             break;
  548.  
  549.         case kMF3DFormatSwappedBinary:
  550.             *outPrimitives = &gMF3D_BinarySwappedPrimitiveMethods;
  551.             break;
  552.  
  553.         case kMF3DFormatText:
  554.             *outPrimitives = &gMF3D_TextPrimitiveMethods;
  555.             break;
  556.  
  557.         default:
  558.             return kMF3DErrIllegalDataType;
  559.     }
  560.     return kMF3DNoErr;
  561. }
  562.  
  563. /*==============================================================================
  564.  *    Dispatch Routines
  565.  *    Integers
  566.  *==============================================================================
  567.  */
  568. MF3DErr
  569. MF3D_Uns8Read(
  570.     MF3D_FilePtr    metafile,
  571.     MF3DUns8        *data)
  572. {
  573.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns8));
  574.     return (*metafile->primitives->readUns8)(metafile, data);
  575. }
  576.  
  577. MF3DErr
  578. MF3D_Uns8Write(
  579.     MF3D_FilePtr    metafile,
  580.     MF3DUns8        data)
  581. {
  582.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns8));
  583.     return (*metafile->primitives->writeUns8)(metafile, data);
  584. }
  585.  
  586. MF3DErr
  587. MF3D_Uns16Read(
  588.     MF3D_FilePtr    metafile,
  589.     MF3DUns16        *data)
  590. {
  591.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns16));
  592.     return (*metafile->primitives->readUns16)(metafile, data);
  593. }
  594.  
  595. MF3DErr
  596. MF3D_Uns16Write(
  597.     MF3D_FilePtr    metafile,
  598.     MF3DUns16        data)
  599. {
  600.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns16));
  601.     return (*metafile->primitives->writeUns16)(metafile, data);
  602. }
  603.  
  604. MF3DErr
  605. MF3D_Uns32Read(
  606.     MF3D_FilePtr    metafile,
  607.     MF3DUns32        *data)
  608. {
  609.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns32));
  610.     return (*metafile->primitives->readUns32)(metafile, data);
  611. }
  612.  
  613. MF3DErr
  614. MF3D_Uns32Write(
  615.     MF3D_FilePtr    metafile,
  616.     MF3DUns32        data)
  617. {
  618.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns32));
  619.     return (*metafile->primitives->writeUns32)(metafile, data);
  620. }
  621.  
  622. MF3DErr
  623. MF3D_Uns64Read(
  624.     MF3D_FilePtr    metafile,
  625.     MF3DUns64        *data)
  626. {
  627.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns64));
  628.     return (*metafile->primitives->readUns64)(metafile, data);
  629. }
  630.  
  631. MF3DErr
  632. MF3D_Uns64Write(
  633.     MF3D_FilePtr    metafile,
  634.     MF3DUns64        data)
  635. {
  636.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns64));
  637.     return (*metafile->primitives->writeUns64)(metafile, data);
  638. }
  639.  
  640. MF3DErr
  641. MF3D_Int8Read(
  642.     MF3D_FilePtr    metafile,
  643.     MF3DInt8        *data)
  644. {
  645.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt8));
  646.     return (*metafile->primitives->readInt8)(metafile, data);
  647. }
  648.  
  649. MF3DErr
  650. MF3D_Int8Write(
  651.     MF3D_FilePtr    metafile,
  652.     MF3DInt8        data)
  653. {
  654.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt8));
  655.     return (*metafile->primitives->writeInt8)(metafile, data);
  656. }
  657.  
  658. MF3DErr
  659. MF3D_Int16Read(
  660.     MF3D_FilePtr    metafile,
  661.     MF3DInt16        *data)
  662. {
  663.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt16));
  664.     return (*metafile->primitives->readInt16)(metafile, data);
  665. }
  666.  
  667. MF3DErr
  668. MF3D_Int16Write(
  669.     MF3D_FilePtr    metafile,
  670.     MF3DInt16        data)
  671. {
  672.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt16));
  673.     return (*metafile->primitives->writeInt16)(metafile, data);
  674. }
  675.  
  676. MF3DErr
  677. MF3D_Int32Read(
  678.     MF3D_FilePtr    metafile,
  679.     MF3DInt32        *data)
  680. {
  681.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt32));
  682.     return (*metafile->primitives->readInt32)(metafile, data);
  683. }
  684.  
  685. MF3DErr
  686. MF3D_Int32Write(
  687.     MF3D_FilePtr    metafile,
  688.     MF3DInt32        data)
  689. {
  690.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt32));
  691.     return (*metafile->primitives->writeInt32)(metafile, data);
  692. }
  693.  
  694. MF3DErr
  695. MF3D_Int64Read(
  696.     MF3D_FilePtr    metafile,
  697.     MFINT64            *data)
  698. {
  699.     MF3D_ValidateReadSize(metafile, sizeof(MFINT64));
  700.     return (*metafile->primitives->readInt64)(metafile, data);
  701. }
  702.  
  703. MF3DErr
  704. MF3D_Int64Write(
  705.     MF3D_FilePtr    metafile,
  706.     MFINT64            data)
  707. {
  708.     MF3D_ValidateWriteSize(metafile, sizeof(MFINT64));
  709.     return (*metafile->primitives->writeInt64)(metafile, data);
  710. }
  711.  
  712. /*==============================================================================
  713.  *    Dispatch Routines
  714.  *    Floats
  715.  *==============================================================================
  716.  */
  717. MF3DErr
  718. MF3D_Float32Read(
  719.     MF3D_FilePtr    metafile,
  720.     MF3DFloat32        *data)
  721. {
  722.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFloat32));
  723.     return (*metafile->primitives->readFloat32)(metafile, data);
  724. }
  725.  
  726. MF3DErr
  727. MF3D_Float32Write(
  728.     MF3D_FilePtr    metafile,
  729.     MF3DFloat32        data)
  730. {
  731.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFloat32));
  732.     return (*metafile->primitives->writeFloat32)(metafile, data);
  733. }
  734.  
  735. MF3DErr
  736. MF3D_Float64Read(
  737.     MF3D_FilePtr    metafile,
  738.     MF3DFloat64        *data)
  739. {
  740.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFloat64));
  741.     return (*metafile->primitives->readFloat64)(metafile, data);
  742. }
  743.  
  744. MF3DErr
  745. MF3D_Float64Write(
  746.     MF3D_FilePtr    metafile,
  747.     MF3DFloat64        data)
  748. {
  749.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFloat64));
  750.     return (*metafile->primitives->writeFloat64)(metafile, data);
  751. }
  752.  
  753. /*==============================================================================
  754.  *    Dispatch Routines
  755.  *    Strings
  756.  *==============================================================================
  757.  */
  758. MF3DErr
  759. MF3D_CStringRead(
  760.     MF3D_FilePtr    metafile,
  761.     MF3DCStringPtr    *data)
  762. {
  763.     /* Must do size validation later */
  764.     return (*metafile->primitives->readCString)(metafile, data);
  765. }
  766.  
  767. MF3DErr
  768. MF3D_CStringWrite(
  769.     MF3D_FilePtr    metafile,
  770.     MF3DCStringPtr    data)
  771. {
  772.     /* Do size validation later */
  773.     return (*metafile->primitives->writeCString)(metafile, data);
  774. }
  775.  
  776. /*==============================================================================
  777.  *    Dispatch Routines
  778.  *    Booleans
  779.  *==============================================================================
  780.  */
  781. MF3DErr
  782. MF3D_BooleanRead(
  783.     MF3D_FilePtr    metafile,
  784.     MF3DBoolean        *data)
  785. {
  786.     MF3D_ValidateReadSize(metafile, sizeof(MF3DBoolean));
  787.     return (*metafile->primitives->readEnum)(metafile,
  788.             gMF3D_BooleanEnum, data);
  789. }
  790.  
  791. MF3DErr
  792. MF3D_BooleanWrite(
  793.     MF3D_FilePtr    metafile,
  794.     MF3DBoolean        data)
  795. {
  796.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DBoolean));
  797.     return (*metafile->primitives->writeEnum)(metafile,
  798.             gMF3D_BooleanEnum, data);
  799. }
  800.  
  801. /*==============================================================================
  802.  *    Dispatch Routines
  803.  *    Raw Data
  804.  *==============================================================================
  805.  */
  806. MF3DErr
  807. MF3D_RawDataRead(
  808.     MF3D_FilePtr    metafile,
  809.     MF3DSize        size,
  810.     MF3DRawDataPtr     data)
  811. {
  812.     MF3D_ValidateReadSize(metafile, size);
  813.     return (*metafile->primitives->readRawData)(metafile, size, data);
  814. }
  815.  
  816. MF3DErr
  817. MF3D_RawDataWrite(
  818.     MF3D_FilePtr    metafile,
  819.     MF3DSize        size,
  820.     MF3DRawDataPtr     data)
  821. {
  822.     MF3D_ValidateWriteSize(metafile, size);
  823.     return (*metafile->primitives->writeRawData)(metafile, size, data);
  824. }
  825.     
  826. /*==============================================================================
  827.  *    Dispatch Routines
  828.  *    Enums
  829.  *==============================================================================
  830.  */
  831. MF3DErr    MF3D_EnumRead(
  832.     MF3D_FilePtr        metafile,
  833.     MF3D_EnumTablePtr    labelID,
  834.     MF3DEnumData        *data)
  835. {
  836.     MF3D_ValidateReadSize(metafile, sizeof(MF3DEnumData));
  837.     return (*metafile->primitives->readEnum)(metafile, labelID, data);
  838. }
  839.  
  840. MF3DErr    MF3D_EnumWrite(
  841.     MF3D_FilePtr        metafile,
  842.     MF3D_EnumTablePtr    labelID,
  843.     MF3DEnumData        data)
  844. {
  845.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DEnumData));
  846.     return (*metafile->primitives->writeEnum)(metafile, labelID, data);
  847. }
  848.  
  849. /*==============================================================================
  850.  *    Dispatch Routines
  851.  *    Flags
  852.  *==============================================================================
  853.  */
  854. MF3DErr    MF3D_FlagsRead(
  855.     MF3D_FilePtr        metafile,
  856.     MF3D_FlagTablePtr    labelID,
  857.     MF3DFlagData        *data)
  858. {
  859.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFlagData));
  860.     return (*metafile->primitives->readFlags)(metafile, labelID, data);
  861. }
  862.  
  863. MF3DErr    MF3D_FlagsWrite(
  864.     MF3D_FilePtr        metafile,
  865.     MF3D_FlagTablePtr    labelID,
  866.     MF3DFlagData        data)
  867. {
  868.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFlagData));
  869.     return (*metafile->primitives->writeFlags)(metafile, labelID, data);
  870. }
  871.  
  872. /*==============================================================================
  873.  *    Dispatch Routines
  874.  *    Begin/End (Size)
  875.  *==============================================================================
  876.  */
  877. MF3DErr
  878. MF3D_BeginRead(
  879.     MF3D_FilePtr        metafile,
  880.     MF3D_ObjStuffPtr    *objStuff,
  881.     MF3DReferenceID        *refID,
  882.     MF3DObjType            *objType)
  883. {
  884.     /* Validate size later */
  885.     return (*metafile->primitives->readBegin)
  886.                     (metafile, objStuff, refID, objType);
  887. }
  888.  
  889. MF3DErr
  890. MF3D_EndRead(
  891.     MF3D_FilePtr    metafile)
  892. {
  893.     /* Validate size later */
  894.     return (*metafile->primitives->readEnd)(metafile);
  895. }
  896.  
  897. MF3DErr
  898. MF3D_BeginWrite(
  899.     MF3D_FilePtr        metafile,
  900.     MF3DVoidObjPtr        object,
  901.     MF3D_ObjStuffPtr    *objStuff)
  902. {
  903.     return (*metafile->primitives->writeBegin) (metafile, object, objStuff);
  904. }
  905.  
  906. MF3DErr
  907. MF3D_EndWrite(
  908.     MF3D_FilePtr    metafile,
  909.     MF3DVoidObjPtr    object)
  910. {
  911.     MF3DErr    result;
  912.  
  913.     result = kMF3DNoErr;
  914.  
  915.     if (object->objectType != kMF3DObjContainer)
  916.         result = (*metafile->primitives->writeEnd)(metafile);
  917.  
  918.     return result;
  919. }
  920.  
  921. /*==============================================================================
  922.  *    Dispatch Routines
  923.  *    Object Type
  924.  *==============================================================================
  925.  */
  926. MF3DErr
  927. MF3D_ObjTypeRead(
  928.     MF3D_FilePtr        metafile,
  929.     MF3D_ObjStuffPtr    *objStuff,
  930.     MF3DObjType            *objType)
  931. {
  932.     return (*metafile->primitives->readObjType)(metafile, objStuff, objType);
  933. }
  934.  
  935. MF3DErr
  936. MF3D_ObjTypeWrite(
  937.     MF3D_FilePtr        metafile,
  938.     MF3DVoidObjPtr        object,
  939.     MF3D_ObjStuffPtr    *objStuff)
  940. {
  941.     return (*metafile->primitives->writeObjType)(metafile, object, objStuff);
  942. }
  943.  
  944. /*==============================================================================
  945.  *    Dispatch Routines
  946.  *    Reference
  947.  *==============================================================================
  948.  */
  949. MF3DErr
  950. MF3D_RefRead(
  951.     MF3D_FilePtr            metafile,
  952.     MF3DPositionReference    *data)
  953. {
  954.     data->format = metafile->dataFormat;
  955.     return (*metafile->primitives->readRef)(metafile, data);
  956. }
  957.  
  958. MF3DErr
  959. MF3D_RefWrite(
  960.     MF3D_FilePtr            metafile,
  961.     MF3D_TOCPosition        data)
  962. {
  963.     return (*metafile->primitives->writeRef)(metafile, data);
  964. }
  965.  
  966. MF3DErr
  967. MF3D_TOCRefWrite(
  968.     MF3D_FilePtr                metafile,
  969.     MF3DPositionReferencePtr    data)
  970. {
  971.     return (*metafile->primitives->writeTOCRef)(metafile, data);
  972. }
  973.  
  974. MF3DErr
  975. MF3D_LabelWrite(
  976.     MF3D_FilePtr                metafile,
  977.     MF3DReferenceInfoPtr        data,
  978.     MF3DBinaryFilePosition        location,
  979.     MF3DObjType                    type)
  980. {
  981.     MF3D_TOCReferencePtr    tempPtr;
  982.     MF3DErr                    result;
  983.  
  984.     result = kMF3DNoErr;
  985.  
  986.     if (data->refID >= metafile->tocStuff.refSeed)
  987.     {    if (data->refID == kMF3DUnreferencedLabel)
  988.             result = kMF3DErrIllegalRefID;
  989.         else
  990.             metafile->tocStuff.refSeed = data->refID + 1;
  991.     }
  992.  
  993.     if (result == kMF3DNoErr)
  994.     {    ++metafile->tocStuff.numReferences;
  995.         tempPtr = MF3D_Realloc(metafile->tocStuff.references,
  996.                 (metafile->tocStuff.numReferences *
  997.                 sizeof(*metafile->tocStuff.references)));
  998.         if (tempPtr == NULL)
  999.             result = kMF3DErrOutOfMemory;
  1000.         else
  1001.             metafile->tocStuff.references = tempPtr;
  1002.     }
  1003.  
  1004.     if (result == kMF3DNoErr)
  1005.     {    result = (*metafile->primitives->writeLabel)
  1006.                 (metafile, data, location, type);
  1007.     }
  1008.  
  1009.     if (result == kMF3DNoErr && type == kMF3DObjContainer)
  1010.         metafile->tocStuff.needToUpdate = kMF3DBooleanTrue;
  1011.  
  1012.     return result;
  1013. }
  1014.  
  1015. /*==============================================================================
  1016.  *    Dispatch Routines
  1017.  *    Preprocess
  1018.  *==============================================================================
  1019.  */
  1020. MF3DErr
  1021. MF3D_PreprocessFile(
  1022.     MF3D_FilePtr        metafile)
  1023. {
  1024.     return (*metafile->primitives->preprocess)(metafile);
  1025. }
  1026.  
  1027. /*==============================================================================
  1028.  *    Dispatch Routines
  1029.  *    Get reference name
  1030.  *==============================================================================
  1031.  */
  1032. MF3DCStringPtr
  1033. MF3D_GetRefName(
  1034.     MF3D_FilePtr        metafile,
  1035.     MF3DReferenceID        refID)
  1036. {
  1037.     return (*metafile->primitives->getRefName)(metafile, refID);
  1038. }
  1039.  
  1040. /*==============================================================================
  1041.  *    Dispatch Routines
  1042.  *    Postprocess
  1043.  *==============================================================================
  1044.  */
  1045. MF3DErr
  1046. MF3D_PostprocessFile(
  1047.     MF3D_FilePtr        metafile)
  1048. {
  1049.     return (*metafile->primitives->postprocess)(metafile);
  1050. }
  1051.  
  1052. /*==============================================================================
  1053.  *    I/O Primitive Routines
  1054.  *    Uns8 Read
  1055.  *==============================================================================
  1056.  */
  1057. MF3DErr
  1058. MF3D_Uns8ReadB(
  1059.     MF3D_FilePtr    metafile,
  1060.     MF3DUns8        *data)
  1061. {
  1062.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1063. }
  1064.  
  1065. MF3DErr
  1066. MF3D_Uns8ReadT(
  1067.     MF3D_FilePtr    metafile,
  1068.     MF3DUns8        *data)
  1069. {
  1070.     unsigned short    foo;
  1071.     MF3DErr            result;
  1072.  
  1073.     result = MF3D_ScanTextBuffer(metafile, "%hu", &foo);
  1074.  
  1075.     if (result == kMF3DNoErr)
  1076.         *data = (MF3DUns8)foo;
  1077.  
  1078.     return result;
  1079. }
  1080.  
  1081. /*==============================================================================
  1082.  *    I/O Primitive Routines
  1083.  *    Uns8 Write
  1084.  *==============================================================================
  1085.  */
  1086. MF3DErr
  1087. MF3D_Uns8WriteB(
  1088.     MF3D_FilePtr    metafile,
  1089.     MF3DUns8        data)
  1090. {
  1091.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1092. }
  1093.  
  1094. MF3DErr
  1095. MF3D_Uns8WriteT(
  1096.     MF3D_FilePtr    metafile,
  1097.     MF3DUns8        data)
  1098. {
  1099.     return MF3D_OutputText(metafile, "%hu ", (unsigned short) data);
  1100. }
  1101.  
  1102. /*==============================================================================
  1103.  *    I/O Primitive Routines
  1104.  *    Uns16 Read
  1105.  *==============================================================================
  1106.  */
  1107. MF3DErr
  1108. MF3D_Uns16ReadB(
  1109.     MF3D_FilePtr    metafile,
  1110.     MF3DUns16        *data)
  1111. {
  1112.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1113. }
  1114.  
  1115. MF3DErr
  1116. MF3D_Uns16ReadBS(
  1117.     MF3D_FilePtr    metafile,
  1118.     MF3DUns16        *data)
  1119. {
  1120.     MF3DErr    result;
  1121.  
  1122.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1123.  
  1124.     if (result == kMF3DNoErr)
  1125.         MF3D_ByteSwap(sizeof(*data), *data);
  1126.  
  1127.     return result;
  1128. }
  1129.  
  1130. MF3DErr
  1131. MF3D_Uns16ReadT(
  1132.     MF3D_FilePtr    metafile,
  1133.     MF3DUns16        *data)
  1134. {
  1135.     return MF3D_ScanTextBuffer(metafile, "%hu", data);
  1136. }
  1137.  
  1138. /*==============================================================================
  1139.  *    I/O Primitive Routines
  1140.  *    Uns16 Write
  1141.  *==============================================================================
  1142.  */
  1143. MF3DErr
  1144. MF3D_Uns16WriteB(
  1145.     MF3D_FilePtr    metafile,
  1146.     MF3DUns16        data)
  1147. {
  1148.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1149. }
  1150.  
  1151. MF3DErr
  1152. MF3D_Uns16WriteBS(
  1153.     MF3D_FilePtr    metafile,
  1154.     MF3DUns16        data)
  1155. {
  1156.     MF3D_ByteSwap(sizeof(data), data);
  1157.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1158. }
  1159.  
  1160. MF3DErr
  1161. MF3D_Uns16WriteT(
  1162.     MF3D_FilePtr    metafile,
  1163.     MF3DUns16        data)
  1164. {
  1165.     return MF3D_OutputText(metafile, "%hu ", data);
  1166. }
  1167.  
  1168. /*==============================================================================
  1169.  *    I/O Primitive Routines
  1170.  *    Uns32 Read
  1171.  *==============================================================================
  1172.  */
  1173. MF3DErr
  1174. MF3D_Uns32ReadB(
  1175.     MF3D_FilePtr    metafile,
  1176.     MF3DUns32        *data)
  1177. {
  1178.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1179. }
  1180.  
  1181. MF3DErr
  1182. MF3D_Uns32ReadBS(
  1183.     MF3D_FilePtr    metafile,
  1184.     MF3DUns32        *data)
  1185. {
  1186.     MF3DErr    result;
  1187.  
  1188.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1189.  
  1190.     if (result == kMF3DNoErr)
  1191.         MF3D_ByteSwap(sizeof(*data), *data);
  1192.  
  1193.     return result;
  1194. }
  1195.  
  1196. MF3DErr
  1197. MF3D_Uns32ReadT(
  1198.     MF3D_FilePtr    metafile,
  1199.     MF3DUns32        *data)
  1200. {
  1201.     return MF3D_ScanTextBuffer(metafile, "%lu", data);
  1202. }
  1203.  
  1204. /*==============================================================================
  1205.  *    I/O Primitive Routines
  1206.  *    Uns32 Write
  1207.  *==============================================================================
  1208.  */
  1209. MF3DErr
  1210. MF3D_Uns32WriteB(
  1211.     MF3D_FilePtr    metafile,
  1212.     MF3DUns32        data)
  1213. {
  1214.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1215. }
  1216.  
  1217. MF3DErr
  1218. MF3D_Uns32WriteBS(
  1219.     MF3D_FilePtr    metafile,
  1220.     MF3DUns32        data)
  1221. {
  1222.     MF3D_ByteSwap(sizeof(data), data);
  1223.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1224. }
  1225.  
  1226. MF3DErr
  1227. MF3D_Uns32WriteT(
  1228.     MF3D_FilePtr    metafile,
  1229.     MF3DUns32        data)
  1230. {
  1231.     return MF3D_OutputText(metafile, "%lu ", data);
  1232. }
  1233.  
  1234. /*==============================================================================
  1235.  *    I/O Primitive Routines
  1236.  *    Uns64 Read
  1237.  *==============================================================================
  1238.  */
  1239. MF3DErr
  1240. MF3D_Uns64ReadB(
  1241.     MF3D_FilePtr    metafile,
  1242.     MF3DUns64        *data)
  1243. {
  1244.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1245. }
  1246.  
  1247. MF3DErr
  1248. MF3D_Uns64ReadBS(
  1249.     MF3D_FilePtr    metafile,
  1250.     MF3DUns64        *data)
  1251. {
  1252.     MF3DErr    result;
  1253.  
  1254.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1255.  
  1256.     if (result == kMF3DNoErr)
  1257.         MF3D_ByteSwap(sizeof(*data), *data);
  1258.  
  1259.     return result;
  1260. }
  1261.  
  1262. MF3DErr
  1263. MF3D_Uns64ReadT(
  1264.     MF3D_FilePtr    metafile,
  1265.     MF3DUns64        *data)
  1266. {
  1267.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1268.     data->hi = 0L;
  1269.     return MF3D_ScanTextBuffer(metafile, "%lu", &(data->lo));
  1270. }
  1271.  
  1272. /*==============================================================================
  1273.  *    I/O Primitive Routines
  1274.  *    Uns64 Write
  1275.  *==============================================================================
  1276.  */
  1277. MF3DErr
  1278. MF3D_Uns64WriteB(
  1279.     MF3D_FilePtr    metafile,
  1280.     MF3DUns64        data)
  1281. {
  1282.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1283. }
  1284.  
  1285. MF3DErr
  1286. MF3D_Uns64WriteBS(
  1287.     MF3D_FilePtr    metafile,
  1288.     MF3DUns64        data)
  1289. {
  1290.     MF3D_ByteSwap(sizeof(data), data);
  1291.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1292. }
  1293.  
  1294. MF3DErr
  1295. MF3D_Uns64WriteT(
  1296.     MF3D_FilePtr    metafile,
  1297.     MF3DUns64        data)
  1298. {
  1299.     MFASSERT(data.hi == 0);
  1300.  
  1301.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1302.     if (data.hi != 0)
  1303.     {    /* ### Values > 2^32-1 cannot be written to text files. */
  1304.         return kMF3DErrUnsupportedUns64;
  1305.     }
  1306.  
  1307.     return MF3D_OutputText(metafile, "%lu ", data.lo);
  1308. }
  1309.  
  1310. /*==============================================================================
  1311.  *    I/O Primitive Routines
  1312.  *    Int8 Read
  1313.  *==============================================================================
  1314.  */
  1315. MF3DErr
  1316. MF3D_Int8ReadB(
  1317.     MF3D_FilePtr    metafile,
  1318.     MF3DInt8        *data)
  1319. {
  1320.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1321. }
  1322.  
  1323. MF3DErr
  1324. MF3D_Int8ReadT(
  1325.     MF3D_FilePtr    metafile,
  1326.     MF3DInt8        *data)
  1327. {
  1328.     short            foo;
  1329.     MF3DErr            result;
  1330.  
  1331.     result = MF3D_ScanTextBuffer(metafile, "%hd", &foo);
  1332.  
  1333.     if (result == kMF3DNoErr)
  1334.         *data = (MF3DInt8)foo;
  1335.  
  1336.     return result;
  1337. }
  1338.  
  1339. /*==============================================================================
  1340.  *    I/O Primitive Routines
  1341.  *    Int8 Write
  1342.  *==============================================================================
  1343.  */
  1344. MF3DErr
  1345. MF3D_Int8WriteB(
  1346.     MF3D_FilePtr    metafile,
  1347.     MF3DInt8        data)
  1348. {
  1349.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1350. }
  1351.  
  1352. MF3DErr
  1353. MF3D_Int8WriteT(
  1354.     MF3D_FilePtr    metafile,
  1355.     MF3DInt8        data)
  1356. {
  1357.     return MF3D_OutputText(metafile, "%hd ", (short) data);
  1358. }
  1359.  
  1360. /*==============================================================================
  1361.  *    I/O Primitive Routines
  1362.  *    Int16 Read
  1363.  *==============================================================================
  1364.  */
  1365. MF3DErr
  1366. MF3D_Int16ReadB(
  1367.     MF3D_FilePtr    metafile,
  1368.     MF3DInt16        *data)
  1369. {
  1370.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1371. }
  1372.  
  1373. MF3DErr
  1374. MF3D_Int16ReadBS(
  1375.     MF3D_FilePtr    metafile,
  1376.     MF3DInt16        *data)
  1377. {
  1378.     MF3DErr    result;
  1379.  
  1380.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1381.  
  1382.     if (result == kMF3DNoErr)
  1383.         MF3D_ByteSwap(sizeof(*data), *data);
  1384.  
  1385.     return result;
  1386. }
  1387.  
  1388. MF3DErr
  1389. MF3D_Int16ReadT(
  1390.     MF3D_FilePtr    metafile,
  1391.     MF3DInt16        *data)
  1392. {
  1393.     return MF3D_ScanTextBuffer(metafile, "%hd", data);
  1394. }
  1395.  
  1396. /*==============================================================================
  1397.  *    I/O Primitive Routines
  1398.  *    Int16 Write
  1399.  *==============================================================================
  1400.  */
  1401. MF3DErr
  1402. MF3D_Int16WriteB(
  1403.     MF3D_FilePtr    metafile,
  1404.     MF3DInt16        data)
  1405. {
  1406.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1407. }
  1408.  
  1409. MF3DErr
  1410. MF3D_Int16WriteBS(
  1411.     MF3D_FilePtr    metafile,
  1412.     MF3DInt16        data)
  1413. {
  1414.     MF3D_ByteSwap(sizeof(data), data);
  1415.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1416. }
  1417.  
  1418. MF3DErr
  1419. MF3D_Int16WriteT(
  1420.     MF3D_FilePtr    metafile,
  1421.     MF3DInt16        data)
  1422. {
  1423.     return MF3D_OutputText(metafile, "%hd ", data);
  1424. }
  1425.  
  1426. /*==============================================================================
  1427.  *    I/O Primitive Routines
  1428.  *    Int32 Read
  1429.  *==============================================================================
  1430.  */
  1431. MF3DErr
  1432. MF3D_Int32ReadB(
  1433.     MF3D_FilePtr    metafile,
  1434.     MF3DInt32        *data)
  1435. {
  1436.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1437. }
  1438.  
  1439. MF3DErr
  1440. MF3D_Int32ReadBS(
  1441.     MF3D_FilePtr    metafile,
  1442.     MF3DInt32        *data)
  1443. {
  1444.     MF3DErr    result;
  1445.  
  1446.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1447.  
  1448.     if (result == kMF3DNoErr)
  1449.         MF3D_ByteSwap(sizeof(*data), *data);
  1450.  
  1451.     return result;
  1452. }
  1453.  
  1454. MF3DErr
  1455. MF3D_Int32ReadT(
  1456.     MF3D_FilePtr    metafile,
  1457.     MF3DInt32        *data)
  1458. {
  1459.     return MF3D_ScanTextBuffer(metafile, "%ld", data);
  1460. }
  1461.  
  1462. /*==============================================================================
  1463.  *    I/O Primitive Routines
  1464.  *    Int32 Write
  1465.  *==============================================================================
  1466.  */
  1467. MF3DErr
  1468. MF3D_Int32WriteB(
  1469.     MF3D_FilePtr    metafile,
  1470.     MF3DInt32        data)
  1471. {
  1472.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1473. }
  1474.  
  1475. MF3DErr
  1476. MF3D_Int32WriteBS(
  1477.     MF3D_FilePtr    metafile,
  1478.     MF3DInt32        data)
  1479. {
  1480.     MF3D_ByteSwap(sizeof(data), data);
  1481.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1482. }
  1483.  
  1484. MF3DErr
  1485. MF3D_Int32WriteT(
  1486.     MF3D_FilePtr    metafile,
  1487.     MF3DInt32        data)
  1488. {
  1489.     return MF3D_OutputText(metafile, "%ld ", data);
  1490. }
  1491.  
  1492. /*==============================================================================
  1493.  *    I/O Primitive Routines
  1494.  *    Int64 Read
  1495.  *==============================================================================
  1496.  */
  1497. MF3DErr
  1498. MF3D_Int64ReadB(
  1499.     MF3D_FilePtr    metafile,
  1500.     MFINT64        *data)
  1501. {
  1502.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1503. }
  1504.  
  1505. MF3DErr
  1506. MF3D_Int64ReadBS(
  1507.     MF3D_FilePtr    metafile,
  1508.     MFINT64        *data)
  1509. {
  1510.     MF3DErr    result;
  1511.  
  1512.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1513.  
  1514.     if (result == kMF3DNoErr)
  1515.         MF3D_ByteSwap(sizeof(*data), *data);
  1516.  
  1517.     return result;
  1518. }
  1519.  
  1520. MF3DErr
  1521. MF3D_Int64ReadT(
  1522.     MF3D_FilePtr    metafile,
  1523.     MFINT64        *data)
  1524. {
  1525.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1526.     data->hi = 0L;
  1527.     return MF3D_ScanTextBuffer(metafile, "%ld", &(data->lo));
  1528. }
  1529.  
  1530. /*==============================================================================
  1531.  *    I/O Primitive Routines
  1532.  *    Int64 Write
  1533.  *==============================================================================
  1534.  */
  1535. MF3DErr
  1536. MF3D_Int64WriteB(
  1537.     MF3D_FilePtr    metafile,
  1538.     MFINT64        data)
  1539. {
  1540.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1541. }
  1542.  
  1543. MF3DErr
  1544. MF3D_Int64WriteBS(
  1545.     MF3D_FilePtr    metafile,
  1546.     MFINT64        data)
  1547. {
  1548.     MF3D_ByteSwap(sizeof(data), data);
  1549.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1550. }
  1551.  
  1552. MF3DErr
  1553. MF3D_Int64WriteT(
  1554.     MF3D_FilePtr    metafile,
  1555.     MFINT64        data)
  1556. {
  1557.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1558.  
  1559.     if ((data.lo < 0 && data.hi != -1) ||
  1560.         (data.lo >= 0 && data.hi != 0))
  1561.     {    /* ### Full 64-bit numbers cannot be written to text files. ### */
  1562.         return kMF3DErrUnsupportedInt64;
  1563.     }
  1564.  
  1565.     return MF3D_OutputText(metafile, "%ld ", data.lo);
  1566. }
  1567.  
  1568. /*==============================================================================
  1569.  *    I/O Primitive Routines
  1570.  *    Float32 Read
  1571.  *==============================================================================
  1572.  */
  1573. MF3DErr
  1574. MF3D_Float32ReadB(
  1575.     MF3D_FilePtr    metafile,
  1576.     MF3DFloat32        *data)
  1577. {
  1578.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1579. }
  1580.  
  1581. MF3DErr
  1582. MF3D_Float32ReadBS(
  1583.     MF3D_FilePtr    metafile,
  1584.     MF3DFloat32        *data)
  1585. {
  1586.     MF3DErr    result;
  1587.  
  1588.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1589.  
  1590.     if (result == kMF3DNoErr)
  1591.         MF3D_ByteSwap(sizeof(*data), *data);
  1592.  
  1593.     return result;
  1594. }
  1595.  
  1596. MF3DErr
  1597. MF3D_Float32ReadT(
  1598.     MF3D_FilePtr    metafile,
  1599.     MF3DFloat32        *data)
  1600. {
  1601.     return MF3D_ScanTextBuffer(metafile, "%f", data);
  1602. }
  1603.  
  1604. /*==============================================================================
  1605.  *    I/O Primitive Routines
  1606.  *    Float32 Write
  1607.  *==============================================================================
  1608.  */
  1609. MF3DErr
  1610. MF3D_Float32WriteB(
  1611.     MF3D_FilePtr    metafile,
  1612.     MF3DFloat32        data)
  1613. {
  1614.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1615. }
  1616.  
  1617. MF3DErr
  1618. MF3D_Float32WriteBS(
  1619.     MF3D_FilePtr    metafile,
  1620.     MF3DFloat32        data)
  1621. {
  1622.     MF3D_ByteSwap(sizeof(data), data);
  1623.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1624. }
  1625.  
  1626. MF3DErr
  1627. MF3D_Float32WriteT(
  1628.     MF3D_FilePtr    metafile,
  1629.     MF3DFloat32        data)
  1630. {
  1631.     return MF3D_OutputText(metafile, "%.7hg ", data);
  1632. }
  1633.  
  1634. /*==============================================================================
  1635.  *    I/O Primitive Routines
  1636.  *    Float64 Read
  1637.  *==============================================================================
  1638.  */
  1639. MF3DErr
  1640. MF3D_Float64ReadB(
  1641.     MF3D_FilePtr    metafile,
  1642.     MF3DFloat64        *data)
  1643. {
  1644.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1645. }
  1646.  
  1647. MF3DErr
  1648. MF3D_Float64ReadBS(
  1649.     MF3D_FilePtr    metafile,
  1650.     MF3DFloat64        *data)
  1651. {
  1652.     MF3DErr    result;
  1653.  
  1654.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1655.  
  1656.     if (result == kMF3DNoErr)
  1657.         MF3D_ByteSwap(sizeof(*data), *data);
  1658.  
  1659.     return result;
  1660. }
  1661.  
  1662. MF3DErr
  1663. MF3D_Float64ReadT(
  1664.     MF3D_FilePtr    metafile,
  1665.     MF3DFloat64        *data)
  1666. {
  1667.     return MF3D_ScanTextBuffer(metafile, "%lf", data);
  1668. }
  1669.  
  1670. /*==============================================================================
  1671.  *    I/O Primitive Routines
  1672.  *    Float64 Write
  1673.  *==============================================================================
  1674.  */
  1675. MF3DErr
  1676. MF3D_Float64WriteB(
  1677.     MF3D_FilePtr    metafile,
  1678.     MF3DFloat64        data)
  1679. {
  1680.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1681. }
  1682.  
  1683. MF3DErr
  1684. MF3D_Float64WriteBS(
  1685.     MF3D_FilePtr    metafile,
  1686.     MF3DFloat64        data)
  1687. {
  1688.     MF3D_ByteSwap(sizeof(data), data);
  1689.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1690. }
  1691.  
  1692. MF3DErr
  1693. MF3D_Float64WriteT(
  1694.     MF3D_FilePtr    metafile,
  1695.     MF3DFloat64        data)
  1696. {
  1697.     return MF3D_OutputText(metafile, "%.17lg ", data);
  1698. }
  1699.  
  1700. /*==============================================================================
  1701.  *    I/O Primitive Routines
  1702.  *    String Read
  1703.  *==============================================================================
  1704.  */
  1705. MF3DErr
  1706. MF3D_CStringReadB(
  1707.     MF3D_FilePtr    metafile,
  1708.     MF3DCStringPtr    *data)
  1709. {
  1710.     MF3D_BuildString    tempStr;
  1711.     MF3DErr                result;
  1712.     char                c;
  1713.  
  1714.     MFASSERT((tempStr.str = NULL) == NULL);
  1715.  
  1716.     result = MF3D_BuildString_New(&tempStr);
  1717.  
  1718.     while (result == kMF3DNoErr)
  1719.     {    MF3D_ValidateReadSize(metafile, sizeof(c));
  1720.         result = MF3D_BinaryReadProc(metafile, sizeof(c), &c);
  1721.         if (result == kMF3DNoErr && c == '\0')
  1722.         {    result = MF3D_BuildString_EndString(&tempStr);
  1723.             *data = tempStr.str;
  1724.             break;                    /* ### NORMAL EXIT IS HERE ### */
  1725.         }
  1726.         if (result == kMF3DNoErr)
  1727.             result = MF3D_BuildString_AddChar(&tempStr, c);
  1728.     }
  1729.  
  1730.     if (result != kMF3DNoErr)
  1731.         MFASSERT(tempStr.str == NULL);
  1732.  
  1733.     return result;
  1734. }
  1735.  
  1736. MF3DErr
  1737. MF3D_CStringReadT(
  1738.     MF3D_FilePtr    metafile,
  1739.     MF3DCStringPtr    *data)
  1740. {
  1741.     /* NOTE! We are not currently calling MF3D_ValidateReadSize */
  1742.     return MF3D_ReadTextString(metafile, data);
  1743. }
  1744.  
  1745. /*==============================================================================
  1746.  *    I/O Primitive Routines
  1747.  *    String Write
  1748.  *==============================================================================
  1749.  */
  1750. MF3DErr
  1751. MF3D_CStringWriteB(
  1752.     MF3D_FilePtr    metafile,
  1753.     MF3DCStringPtr    data)
  1754. {
  1755.     MF3DUns32    len;
  1756.     MF3DErr        result;
  1757.  
  1758.     len = CStringLen(data);
  1759.  
  1760.     /* Write the string */
  1761.     MF3D_ValidateWriteSize(metafile, len);
  1762.     result = MF3D_WriteProc(metafile, len, data);
  1763.  
  1764.     /* Add end-of-string character and pad to 4-byte boundary */
  1765.     if (result == kMF3DNoErr)
  1766.     {    MF3DUns32    padding;
  1767.  
  1768. /* F7K_PAM Nyet!        padding = 5 - ((len + 1) % 4); */
  1769.         padding = 4 - (len % 4);        /* F7K_PAM includes string terminator */
  1770.         MFASSERT(padding >= 1 && padding <= 4);
  1771.  
  1772.         MF3D_ValidateWriteSize(metafile, padding);
  1773.         result = MF3D_WriteProc(metafile, padding, &zero);
  1774.     }
  1775.  
  1776.     return result;
  1777. }
  1778.  
  1779. MF3DErr
  1780. MF3D_CStringWriteT(
  1781.     MF3D_FilePtr    metafile,
  1782.     MF3DCStringPtr    data)
  1783. {
  1784.     return MF3D_WriteTextString(metafile, data);
  1785. }
  1786.  
  1787. /*==============================================================================
  1788.  *    I/O Primitive Routines
  1789.  *    Raw Data Read
  1790.  *==============================================================================
  1791.  */
  1792. MF3DErr
  1793. MF3D_RawDataReadB(
  1794.     MF3D_FilePtr    metafile,
  1795.     MF3DSize        size,
  1796.     MF3DRawDataPtr     data)
  1797. {
  1798.     char    ignoredData[3];
  1799.     MF3DErr    result;
  1800.  
  1801.     result = MF3D_BinaryReadProc(metafile, size, (char *)data);
  1802.  
  1803.     if (result == kMF3DNoErr)
  1804.     {    if ((size % 4) != 0)
  1805.             result = MF3D_BinaryReadProc(metafile, 4 - (size % 4), ignoredData);
  1806.     }
  1807.  
  1808.     return result;
  1809. }
  1810.  
  1811. MF3DErr
  1812. MF3D_RawDataReadT(
  1813.     MF3D_FilePtr    metafile,
  1814.     MF3DSize        size,
  1815.     MF3DRawDataPtr     data)
  1816. {
  1817.     MF3DSize        leftToRead;
  1818.     MF3DErr            result;
  1819.     MF3DRawDataPtr    rawDataPtr;
  1820.     char            *inputStr;
  1821.     char            formatString[kMF3D_MaxDigitsInUns32 + 5 +
  1822.                             kMF3D_HexCharListLen + 1];
  1823.  
  1824.     leftToRead = size;
  1825.     result = kMF3DNoErr;
  1826.     rawDataPtr = data;
  1827.  
  1828.     /* two text chars represent one hex byte */
  1829.     inputStr = MF3D_Malloc(leftToRead * 2 + kMF3D_RawDataHexPrefixLen + 1);
  1830.     if (inputStr == NULL)
  1831.         result = kMF3DErrOutOfMemory;
  1832.  
  1833.     while (leftToRead > 0 && result == kMF3DNoErr)
  1834.     {    char        numString[kMF3D_MaxDigitsInUns32 + 1];
  1835.  
  1836.         inputStr = MF3D_Realloc(inputStr, leftToRead * 2 +
  1837.                 kMF3D_RawDataHexPrefixLen + 1);
  1838.         MFASSERT(inputStr != NULL);    /* should not happen when downsizing */
  1839.  
  1840.         /* Build a format string such that data will not be overflowed */
  1841.         strcpy(formatString, kMF3D_RawDataHexPrefix "%");
  1842.         MF3D_NumToString(leftToRead * 2, numString);
  1843.         strcat(formatString, numString);
  1844.         strcat(formatString, "[" kMF3D_HexCharList "]");
  1845.  
  1846.         /* Copy into where we last left off */
  1847.         result = MF3D_ScanTextBuffer(metafile, formatString, inputStr);
  1848.  
  1849.         if (result == kMF3DNoErr)
  1850.         {    char    c1, c2, *indexStr;
  1851.  
  1852.             indexStr = inputStr;
  1853.             while ((c1 = *indexStr++) != '\0' && (c2 = *indexStr++) != '\0')
  1854.             {    *rawDataPtr++ = (MF3D_TextToHex(c1) << 4) | MF3D_TextToHex(c2);
  1855.                 --leftToRead;
  1856.             }
  1857.             if (c1 != '\0')
  1858.                 result = kMF3DErrRawDataOddNumberOfHexChars;
  1859.         }
  1860.     }
  1861.  
  1862.     MF3D_Free(inputStr);
  1863.  
  1864.     return result;
  1865. }
  1866.  
  1867. /*==============================================================================
  1868.  *    I/O Primitive Routines
  1869.  *    Raw Data Write
  1870.  *==============================================================================
  1871.  */
  1872. MF3DErr
  1873. MF3D_RawDataWriteB(
  1874.     MF3D_FilePtr    metafile,
  1875.     MF3DSize        size,
  1876.     MF3DRawDataPtr     data)
  1877. {
  1878.     MF3DErr    result;
  1879.  
  1880.     result = MF3D_WriteProc(metafile, size, data);
  1881.  
  1882.     if (result == kMF3DNoErr && (size % 4) > 0)
  1883.     {    result = MF3D_WriteProc(metafile, 4 - (size % 4), &zero);
  1884.     }
  1885.  
  1886.     return result;
  1887. }
  1888.     
  1889. MF3DErr
  1890. MF3D_RawDataWriteT(
  1891.     MF3D_FilePtr    metafile,
  1892.     MF3DSize        size,
  1893.     MF3DRawDataPtr     data)
  1894. {
  1895.     unsigned char    *dataPtr;
  1896.     MF3DSize        leftToDo;
  1897.     unsigned int    bytesToDoOnThisLine;
  1898.     MF3DErr            result;
  1899.  
  1900.     leftToDo = size;
  1901.     dataPtr = (unsigned char *) data;
  1902.  
  1903.     MF3D_WriteNewLine(metafile);
  1904.  
  1905.     while (result == kMF3DNoErr && leftToDo > 0)
  1906.     {    
  1907.         bytesToDoOnThisLine = kMF3D_RawDataBytesPerLine;
  1908.  
  1909.         result = MF3D_OutputText(metafile, "%s", kMF3D_RawDataHexPrefix);
  1910.  
  1911.         while (result == kMF3DNoErr &&
  1912.                 leftToDo > 0 && bytesToDoOnThisLine-- > 0)
  1913.         {    result = MF3D_OutputText(metafile, "%.2X", *dataPtr++);
  1914.             --leftToDo;
  1915.         }
  1916.  
  1917.         if (result == kMF3DNoErr)
  1918.             MF3D_WriteNewLine(metafile);
  1919.     }
  1920.  
  1921.     return result;
  1922. }
  1923.     
  1924. /*==============================================================================
  1925.  *    I/O Primitive Routines
  1926.  *    Enum Read
  1927.  *==============================================================================
  1928.  */
  1929. MF3DErr    MF3D_EnumReadB(
  1930.     MF3D_FilePtr        metafile,
  1931.     MF3D_EnumTablePtr    labelID,
  1932.     MF3DEnumData        *data)
  1933. {
  1934.     MF3D_Unused(labelID);
  1935.  
  1936.     return MF3D_Uns32ReadB(metafile, data);
  1937. }
  1938.  
  1939. MF3DErr    MF3D_EnumReadBS(
  1940.     MF3D_FilePtr        metafile,
  1941.     MF3D_EnumTablePtr    labelID,
  1942.     MF3DEnumData        *data)
  1943. {
  1944.     MF3D_Unused(labelID);
  1945.  
  1946.     return MF3D_Uns32ReadBS(metafile, data);
  1947. }
  1948.  
  1949. MF3DErr    MF3D_EnumReadT(
  1950.     MF3D_FilePtr        metafile,
  1951.     MF3D_EnumTablePtr    labelID,
  1952.     MF3DEnumData        *data)
  1953. {
  1954.     MF3DUns32    num;
  1955.     MF3DErr        result;
  1956.     char        str[kMF3D_MaxLabelLength + 1];
  1957.  
  1958.     /* Check for number or text */
  1959.     result = MF3D_ScanTextBuffer(metafile, "%li", &num);
  1960.  
  1961.     if (result == kMF3DNoErr)
  1962.     {    /* got a number for some reason */
  1963.         result = MF3D_MatchLabelByValue(labelID, num, NULL);
  1964.     }
  1965.     else
  1966.     {    result = MF3D_ScanTextBuffer(metafile,
  1967.                 "%[" KMF3D_TextCharList "]", str);
  1968.         if (result == kMF3DNoErr)
  1969.         {    result = MF3D_MatchLabelByName(labelID, str, &num);
  1970.         }
  1971.     }
  1972.  
  1973.     if (result == kMF3DNoErr)
  1974.         *data = num;
  1975.  
  1976.     return result;
  1977. }
  1978.  
  1979. /*==============================================================================
  1980.  *    I/O Primitive Routines
  1981.  *    Enum Write
  1982.  *==============================================================================
  1983.  */
  1984. MF3DErr    MF3D_EnumWriteB(
  1985.     MF3D_FilePtr        metafile,
  1986.     MF3D_EnumTablePtr    labelID,
  1987.     MF3DEnumData        data)
  1988. {
  1989.     MF3D_Unused(labelID);
  1990.  
  1991.     return MF3D_Uns32WriteB(metafile, data);
  1992. }
  1993.  
  1994. MF3DErr    MF3D_EnumWriteBS(
  1995.     MF3D_FilePtr        metafile,
  1996.     MF3D_EnumTablePtr    labelID,
  1997.     MF3DEnumData        data)
  1998. {
  1999.     MF3D_Unused(labelID);
  2000.  
  2001.     return MF3D_Uns32WriteBS(metafile, data);
  2002. }
  2003.  
  2004. MF3DErr    MF3D_EnumWriteT(
  2005.     MF3D_FilePtr        metafile,
  2006.     MF3D_EnumTablePtr    labelID,
  2007.     MF3DEnumData        data)
  2008. {
  2009.     MF3DErr            result;
  2010.     MF3DCStringPtr    labelStr;
  2011.  
  2012.     result = MF3D_MatchLabelByValue(labelID, data, &labelStr);
  2013.  
  2014.     if (result == kMF3DNoErr)
  2015.     {    result = MF3D_OutputText(metafile, "%s ", labelStr);
  2016.         MF3D_Free(labelStr);
  2017.     }
  2018.  
  2019.     return result;
  2020. }
  2021.  
  2022. /*==============================================================================
  2023.  *    I/O Primitive Routines
  2024.  *    Flags Read
  2025.  *==============================================================================
  2026.  */
  2027. MF3DErr    MF3D_FlagsReadB(
  2028.     MF3D_FilePtr        metafile,
  2029.     MF3D_FlagTablePtr    labelID,
  2030.     MF3DFlagData        *data)
  2031. {
  2032.     MF3D_Unused(labelID);
  2033.  
  2034.     return MF3D_Uns32ReadB(metafile, data);
  2035. }
  2036.  
  2037. MF3DErr    MF3D_FlagsReadBS(
  2038.     MF3D_FilePtr        metafile,
  2039.     MF3D_FlagTablePtr    labelID,
  2040.     MF3DFlagData        *data)
  2041. {
  2042.     MF3D_Unused(labelID);
  2043.  
  2044.     return MF3D_Uns32ReadBS(metafile, data);
  2045. }
  2046.  
  2047. MF3DErr    MF3D_FlagsReadT(
  2048.     MF3D_FilePtr        metafile,
  2049.     MF3D_FlagTablePtr    labelID,
  2050.     MF3DFlagData        *data)
  2051. {
  2052.     MF3DUns32    num;
  2053.     MF3DUns32    flagValue;
  2054.     MF3DErr        result;
  2055.     char        str[kMF3D_MaxLabelLength + 1];
  2056.  
  2057.     /* Check for number or text */
  2058.     result = MF3D_ScanTextBuffer(metafile, "%li", &num);
  2059.  
  2060.     if (result == kMF3DNoErr)
  2061.     {    /* got a number for some reason */
  2062.         MF3DUns32    flagShifter;
  2063.  
  2064.         flagShifter = num;
  2065.         flagValue = 1;
  2066.         while (result == kMF3DNoErr && flagShifter > 0)
  2067.         {    /* Check each set flag to see whether it exists */
  2068.             if (flagShifter & 0x00000001)
  2069.             {    result = MF3D_MatchLabelByValue(labelID, flagValue, NULL);
  2070.             }
  2071.             flagValue <<= 1;
  2072.             flagShifter >>= 1;
  2073.         }
  2074.     }
  2075.     else
  2076.     {    num = 0;
  2077.         do
  2078.         {    result = MF3D_ScanTextBuffer(metafile,
  2079.                     "%[" KMF3D_TextCharList "]", str);
  2080.             if (result == kMF3DNoErr)
  2081.             {    result = MF3D_MatchLabelByName(labelID, str, &flagValue);
  2082.                 num |= flagValue;
  2083.             }
  2084.         } while (result == kMF3DNoErr && MF3D_ScanTextBuffer(metafile,
  2085.                     "%1[" kMF3D_OrCharStr "]", str) == kMF3DNoErr);
  2086.     }
  2087.  
  2088.     if (result == kMF3DNoErr)
  2089.         *data = num;
  2090.  
  2091.     return result;
  2092. }
  2093.  
  2094. /*==============================================================================
  2095.  *    I/O Primitive Routines
  2096.  *    Flags Write
  2097.  *==============================================================================
  2098.  */
  2099. MF3DErr    MF3D_FlagsWriteB(
  2100.     MF3D_FilePtr        metafile,
  2101.     MF3D_FlagTablePtr    labelID,
  2102.     MF3DFlagData        data)
  2103. {
  2104.     MF3D_Unused(labelID);
  2105.  
  2106.     return MF3D_Uns32WriteB(metafile, data);
  2107. }
  2108.  
  2109. MF3DErr    MF3D_FlagsWriteBS(
  2110.     MF3D_FilePtr        metafile,
  2111.     MF3D_FlagTablePtr    labelID,
  2112.     MF3DFlagData        data)
  2113. {
  2114.     MF3D_Unused(labelID);
  2115.  
  2116.     return MF3D_Uns32WriteBS(metafile, data);
  2117. }
  2118.  
  2119. MF3DErr    MF3D_FlagsWriteT(
  2120.     MF3D_FilePtr        metafile,
  2121.     MF3D_FlagTablePtr    labelID,
  2122.     MF3DFlagData        data)
  2123. {
  2124.     MF3DErr            result;
  2125.     MF3DCStringPtr    labelStr;
  2126.  
  2127.     result = kMF3DNoErr;
  2128.  
  2129.     if (data == 0)
  2130.     {    /* All flags off */
  2131.         result = MF3D_MatchLabelByValue(labelID, data, &labelStr);
  2132.  
  2133.         if (result == kMF3DNoErr)
  2134.         {    result = MF3D_OutputText(metafile, "%s ", labelStr);
  2135.             MF3D_Free(labelStr);
  2136.         }
  2137.     }
  2138.     else
  2139.     {    /* At least one flag on */
  2140.         MF3DUns32    flagShifter;
  2141.         MF3DUns32    flagValue;
  2142.  
  2143.         flagShifter = data;
  2144.         flagValue = 0x00000001;
  2145.         do
  2146.         {    if (flagShifter & 0x00000001)
  2147.             {    char    formatStr[5];
  2148.  
  2149.                 result = MF3D_MatchLabelByValue(labelID, flagValue, &labelStr);
  2150.                 if (result == kMF3DNoErr)
  2151.                 {    strcpy(formatStr, "%s ");
  2152.                     /* If there is more to come, add the Or character */
  2153.                     if (flagShifter > 0x00000001)
  2154.                         strcat(formatStr, kMF3D_OrCharStr " ");
  2155.  
  2156.                     result = MF3D_OutputText(metafile, formatStr, labelStr);
  2157.                     MF3D_Free(labelStr);
  2158.                 }
  2159.             }
  2160.             flagShifter >>= 1;
  2161.             flagValue <<= 1;
  2162.         } while (result == kMF3DNoErr && flagShifter > 0);
  2163.     }
  2164.  
  2165.     return result;
  2166. }
  2167.  
  2168. /*==============================================================================
  2169.  *    I/O Primitive Routines
  2170.  *    Begin Object
  2171.  *==============================================================================
  2172.  */
  2173. MF3DErr
  2174. MF3D_BeginReadB(
  2175.     MF3D_FilePtr        metafile,
  2176.     MF3D_ObjStuffPtr    *objStuff,
  2177.     MF3DReferenceID        *refID,
  2178.     MF3DObjType            *objType)
  2179. {
  2180.     MF3DBinaryFilePosition    location;
  2181.     MF3DUns32                objectSize;
  2182.     char                    *readBuffer;
  2183.     MF3DErr                    result;
  2184.  
  2185.     /* Need to know where we are to see whether there is a label here. */
  2186.     result = MF3DTellPosition(metafile, &location);
  2187.  
  2188.     /* Read signature and size */
  2189.     if (result == kMF3DNoErr)
  2190.     {    if (metafile->readBuffer.buf == NULL)
  2191.         {    /* Call readProc directly because buffer is not set up */
  2192.             result = (*metafile->procsRec.readProc) (metafile->userFilePtr,
  2193.                     sizeof(MF3DObjType), (char *)objType);
  2194.     
  2195.             if (result == kMF3DErrReadFailedEOF)
  2196.                 result = kMF3DNoMoreObjects;
  2197.     
  2198.             if (result == kMF3DNoErr)
  2199.             {    result = (*metafile->procsRec.readProc) (metafile->userFilePtr,
  2200.                         sizeof(MF3DUns32), (char *) &objectSize);
  2201.             }
  2202.         }
  2203.         else
  2204.         {    /* Buffer already exists because we are in a container or group.
  2205.              * Use normal read routines.
  2206.              */
  2207.             result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType),
  2208.                     (char *)objType);
  2209.     
  2210.             if (result == kMF3DNoErr)
  2211.             {    result = MF3D_BinaryReadProc(metafile, sizeof(MF3DUns32),
  2212.                         (char *) &objectSize);
  2213.             }
  2214.         }
  2215.     }
  2216.  
  2217.     /* F7K_PAM swap object type and size that were just read in from file */
  2218.     if (result == kMF3DNoErr && metafile->dataFormat == kMF3DFormatSwappedBinary)
  2219.     {    MF3D_ByteSwap4(*objType);
  2220.         MF3D_ByteSwap4(objectSize);
  2221.     }
  2222.     
  2223.     /* FB4_JRK */
  2224.     /* Allow unknown objects to be parsed by fixing error */
  2225.     if (result == kMF3DNoErr)
  2226.     {    result = MF3D_FindObjectFromType(*objType, objStuff);
  2227.         if (result == kMF3DErrIllegalObjName)
  2228.             result = kMF3DNoErr;
  2229.     }
  2230.  
  2231.     /* Get refID if in TOC */
  2232.     if (result == kMF3DNoErr)
  2233.         result = MF3D_GetBinaryRefID(metafile, location, refID);
  2234.  
  2235.     if (result == kMF3DNoErr)
  2236.     {    if (metafile->readBuffer.buf == NULL)
  2237.         {    /* Allocate the readBuffer */
  2238.             readBuffer = MF3D_Malloc(objectSize);
  2239.             if (readBuffer == NULL)
  2240.                 result = kMF3DErrOutOfMemory;
  2241.  
  2242.             if (result == kMF3DNoErr)
  2243.             {    result = (*metafile->procsRec.readProc)
  2244.                         (metafile->userFilePtr, objectSize, readBuffer);
  2245.             }
  2246.         
  2247.             if (result == kMF3DNoErr)
  2248.             {    MFASSERT(metafile->readBuffer.buf == NULL);
  2249.                 metafile->readBuffer.buf = readBuffer;
  2250.                 metafile->readBuffer.bufPos = 0;
  2251.                 metafile->readBuffer.bufSize = objectSize;
  2252.                 metafile->readBuffer.saveSize = NULL;
  2253.             }
  2254.         }
  2255.         else
  2256.         {    /* Inside a container, readBuffer already allocated.
  2257.              * So, we need to save the current buffer size and
  2258.              * shrink apparent size of the buffer to size the new object.
  2259.              */
  2260.             MF3D_SaveBufferPtr    sizeStack;
  2261.  
  2262.             MF3D_Allocate(sizeStack);
  2263.  
  2264.             if (result == kMF3DNoErr)
  2265.             {    /* Save size of parent */
  2266.                 sizeStack->bufSize = metafile->readBuffer.bufSize;
  2267.                 sizeStack->next = metafile->readBuffer.saveSize;
  2268.  
  2269.                 /* Validate the new buffer size */
  2270.                 if ((metafile->readBuffer.bufPos + objectSize) >
  2271.                         sizeStack->bufSize)
  2272.                 {    result = kMF3DErrContainedObjTooBig;
  2273.                 }
  2274.  
  2275.                 /* Set new (temporary) buffer size */
  2276.                 if (result == kMF3DNoErr)
  2277.                 {    metafile->readBuffer.bufSize = metafile->readBuffer.bufPos +
  2278.                             objectSize;
  2279.                     metafile->readBuffer.saveSize = sizeStack;
  2280.                 }
  2281.             }
  2282.         }
  2283.     }
  2284.  
  2285.     return result;
  2286. }
  2287.  
  2288. /*==============================================================================
  2289.  *    MF3D_BeginReadT
  2290.  *
  2291.  *    Begin reading a text object: read name and open paren
  2292.  *
  2293.  *    Return
  2294.  *        kMF3DNoErr            if an object is successfully read
  2295.  *        kMF3DNoMoreObjects    if a close parenthesis was read
  2296.  *        any other error        if an error occurs during parsing
  2297.  *==============================================================================
  2298.  */
  2299. MF3DErr
  2300. MF3D_BeginReadT(
  2301.     MF3D_FilePtr        metafile,
  2302.     MF3D_ObjStuffPtr    *objStuff,
  2303.     MF3DReferenceID        *refID,
  2304.     MF3DObjType            *objType)
  2305. {
  2306.     MF3DUns32                    objIndex, numObjTableEntries;
  2307.     MF3D_ObjectTableEntryPtr    objTableEntryPtr;
  2308.     MF3DBinaryFilePosition        curPos;
  2309.     char                        *readBuffer;
  2310.     MF3DUns32                    objectSize;
  2311.     MF3DErr                        result;
  2312.  
  2313.     /* Find out where we are */
  2314.     result = MF3DTellPosition(metafile, &curPos);
  2315.  
  2316.     /* Find curPos in the objTable */
  2317.     numObjTableEntries = metafile->objTable.numObjects;
  2318.     objTableEntryPtr = metafile->objTable.objects;
  2319.     for (objIndex = 0; objIndex < numObjTableEntries;
  2320.             ++objIndex, ++objTableEntryPtr)
  2321.     {    /* Find the first position >= curPos.
  2322.          * That will be the beginning of the object.
  2323.          */
  2324.         if (CompareInt64(objTableEntryPtr->objLocation, curPos) >= 0)
  2325.             break;
  2326.     }
  2327.     if (objIndex >= numObjTableEntries)
  2328.         result = kMF3DNoMoreObjects;
  2329.  
  2330.     MFASSERT(result == kMF3DNoMoreObjects ||
  2331.             CompareInt64(objTableEntryPtr->objLocation, curPos) == 0);
  2332.  
  2333.     /* Create read buffer */
  2334.     if (result == kMF3DNoErr && metafile->readBuffer.buf == NULL)
  2335.     {    /* ###NOTE###
  2336.          * Objects must be no bigger than an Uns32 for this subtract
  2337.          * to work. (If we have that much data, our malloc is probably
  2338.          * going to fail anyway.)
  2339.          */
  2340.         objectSize = SubtractUns64(objTableEntryPtr[1].objLocation, curPos);
  2341.         readBuffer = MF3D_Malloc(objectSize + 1);
  2342.         if (readBuffer == NULL)
  2343.             result = kMF3DErrOutOfMemory;
  2344.  
  2345.         if (result == kMF3DNoErr)
  2346.         {    result = (*metafile->procsRec.readProc)
  2347.                     (metafile->userFilePtr, objectSize, readBuffer);
  2348.         }
  2349.  
  2350.         /* Setup the read buffer (if we were not called from IntObjectRead) */
  2351.         if (result == kMF3DNoErr)
  2352.         {    metafile->readBuffer.buf = readBuffer;
  2353.             metafile->readBuffer.buf[objectSize] = '\0';
  2354.             metafile->readBuffer.bufPos = 0;
  2355.             metafile->readBuffer.saveSize = NULL;
  2356. #if defined(DEBUG) && DEBUG > 0
  2357.             metafile->readBuffer.bufSize = objectSize;
  2358. #endif
  2359.         }
  2360.  
  2361.         /* If this object had a label, we need to skip past it */
  2362.         /* JRK */
  2363.         /* This used to be outside the check for buf == NULL, but we
  2364.          * had a problem with BeginGroup, because the object inside
  2365.          * looked as thought it had a label when it didn't. Now we
  2366.          * only look for labels in outer-most object.
  2367.          */
  2368.         if (result == kMF3DNoErr)
  2369.         {    *refID = objTableEntryPtr->objRefID;
  2370.             if (*refID > 0)
  2371.             {    result = MF3D_SkipText(metafile);
  2372.             }
  2373.         }
  2374.     }
  2375.     else {
  2376.         /* If we're not the outside object, we don't have a ref */
  2377.         *refID = 0;
  2378.     }
  2379.  
  2380.     /* FB5_JRK
  2381.      * Read object name and translate to signature.
  2382.      * Allow unknown objects to be parsed by fixing error.
  2383.      */
  2384.     if (result == kMF3DNoErr)
  2385.     {    result = MF3D_ReadObjectStuff(metafile, objStuff, objType);
  2386.         if (result == kMF3DErrIllegalObjName)
  2387.             result = kMF3DNoErr;
  2388.     }
  2389.  
  2390.     /* Read open paren */
  2391.     if (result == kMF3DNoErr)
  2392.         result = MF3D_ReadOpenParen(metafile);
  2393.  
  2394.     return result;
  2395. }
  2396.  
  2397. /*==============================================================================
  2398.  *    MF3D_BeginWriteB
  2399.  *
  2400.  *    Write object name and allot room for object size
  2401.  *==============================================================================
  2402.  */
  2403. MF3DErr
  2404. MF3D_BeginWriteB(
  2405.     MF3D_FilePtr        metafile,
  2406.     MF3DVoidObjPtr        object,
  2407.     MF3D_ObjStuffPtr    *objStuff)
  2408. {
  2409.     MF3D_WriteStackPtr    wsPtr;
  2410.     MF3DErr                result;
  2411.  
  2412.     /* Get objStuff and write the object type */
  2413.     result = MF3D_ObjTypeWrite(metafile, object, objStuff);
  2414.  
  2415.     if (result == kMF3DNoErr && object->objectType != kMF3DObjEndContainer)
  2416.     {    /* Allocate write stack link */
  2417.         MF3D_Allocate(wsPtr);
  2418.  
  2419.         /* Remember the location for the object size */
  2420.         if (result == kMF3DNoErr)
  2421.             result = MF3DTellPosition(metafile, &wsPtr->location);
  2422.     
  2423.         /* Write the phony object size */
  2424.         if (result == kMF3DNoErr)
  2425.             result = MF3D_Uns32Write(metafile, 0L);
  2426.     
  2427.         if (result == kMF3DNoErr)
  2428.         {    wsPtr->next = metafile->writeStack;
  2429.             metafile->writeStack = wsPtr;
  2430.         }
  2431.         else
  2432.             MF3D_Free(wsPtr);
  2433.     }
  2434.  
  2435.     return result;
  2436. }
  2437.  
  2438. /*==============================================================================
  2439.  *    MF3D_BeginWriteT
  2440.  *
  2441.  *    Write the object name and opening parenthesis
  2442.  *==============================================================================
  2443.  */
  2444. MF3DErr
  2445. MF3D_BeginWriteT(
  2446.     MF3D_FilePtr        metafile,
  2447.     MF3DVoidObjPtr        object,
  2448.     MF3D_ObjStuffPtr    *objStuff)
  2449. {
  2450.     MF3DErr                        result;
  2451.  
  2452.     result = kMF3DNoErr;
  2453.  
  2454.     /* Write the object type */
  2455.     result = MF3D_ObjTypeWrite(metafile, object, objStuff);
  2456.  
  2457.     /* Write the opening paren */
  2458.     if (result == kMF3DNoErr && object->objectType != kMF3DObjEndContainer)
  2459.     {    ++metafile->indent;
  2460.         result = MF3D_WriteProc(metafile, strlen(kMF3D_BeginCharStr " "),
  2461.                 kMF3D_BeginCharStr " ");
  2462.     }
  2463.  
  2464.     return result;
  2465. }
  2466.  
  2467. /*==============================================================================
  2468.  *    I/O Primitive Routines
  2469.  *    End Object
  2470.  *==============================================================================
  2471.  */
  2472. MF3DErr
  2473. MF3D_EndReadB(
  2474.     MF3D_FilePtr    metafile)
  2475. {
  2476.     MF3DUns32    bufPos;
  2477.     MF3DErr        result;
  2478.  
  2479.     MFASSERT(metafile->readBuffer.buf != NULL);
  2480.  
  2481.     result = kMF3DNoErr;
  2482.  
  2483.     /* Binary file objects are supposed to be padded to four-byte boundaries */
  2484.     bufPos = metafile->readBuffer.bufPos;
  2485.     if ((metafile->readBuffer.bufSize & 0x00000003) == 0)
  2486.         bufPos = (bufPos + 3) & (~0x00000003);
  2487.  
  2488.     if (bufPos != metafile->readBuffer.bufSize)
  2489.         result = kMF3DErrDidntReadEntireObj;
  2490.  
  2491.     if (result == kMF3DNoErr)
  2492.     {    if (metafile->readBuffer.saveSize != NULL)
  2493.         {    /* If saveSize exists, we are inside a container/group.
  2494.              * We need to expand the buffer size to the parent object again.
  2495.              */
  2496.             MF3D_SaveBufferPtr    sizeStack;
  2497.     
  2498.             sizeStack = metafile->readBuffer.saveSize;
  2499.             metafile->readBuffer.bufSize = sizeStack->bufSize;
  2500.             metafile->readBuffer.saveSize = sizeStack->next;
  2501.             MF3D_Free(sizeStack);
  2502.         }
  2503.         else
  2504.         {    /* If there was no saveSize, then we have reached the end
  2505.              * of a top-level object, and we can free the readBuffer.
  2506.              */
  2507.             MF3D_Free(metafile->readBuffer.buf);
  2508.             metafile->readBuffer.buf = NULL;
  2509.         }
  2510.     }
  2511.  
  2512.     return result;
  2513. }
  2514.  
  2515. MF3DErr
  2516. MF3D_EndReadT(
  2517.     MF3D_FilePtr    metafile)
  2518. {
  2519.     char    closeParen[2];
  2520.     MF3DErr    result;
  2521.  
  2522.     result = MF3D_ScanTextBuffer(metafile, "%1[" kMF3D_EndCharStr "]",
  2523.             closeParen);
  2524.  
  2525.     if (result == kMF3DNoErr)
  2526.     {    MF3D_SkipWhitespace(metafile);
  2527.         /* If we have reached the end of the object, free the buffer */
  2528.         if (metafile->readBuffer.buf[metafile->readBuffer.bufPos] == '\0')
  2529.         {    MFASSERT(metafile->readBuffer.bufPos ==
  2530.                     metafile->readBuffer.bufSize);
  2531.             MF3D_Free(metafile->readBuffer.buf);
  2532.             metafile->readBuffer.buf = NULL;
  2533.         }
  2534.     }
  2535.  
  2536.     return result;
  2537. }
  2538.  
  2539. /*==============================================================================
  2540.  *    MF3D_EndWriteB
  2541.  *
  2542.  *    Now that we know the object size, patch it back into the top of the
  2543.  *    object structure
  2544.  *==============================================================================
  2545.  */
  2546. MF3DErr
  2547. MF3D_EndWriteB(
  2548.     MF3D_FilePtr    metafile)
  2549. {
  2550.     MF3D_WriteStackPtr        writeStackPtr;
  2551.     MF3DBinaryFilePosition    curPos;
  2552.     MF3DSize                size;
  2553.     MF3DSize                padding;
  2554.     MF3DErr                    result;
  2555.  
  2556.     result = kMF3DNoErr;
  2557.  
  2558.     writeStackPtr = metafile->writeStack;
  2559.  
  2560.     if (writeStackPtr == NULL)
  2561.         result = kMF3DErrTooManyEndContainers;
  2562.  
  2563.     if (result == kMF3DNoErr)
  2564.         result = MF3DTellPosition(metafile, &curPos);
  2565.  
  2566.     if (result == kMF3DNoErr)
  2567.         result = MF3DSeekPosition(metafile, writeStackPtr->location);
  2568.  
  2569.     if (result == kMF3DNoErr)
  2570.     {    size = SubtractUns64(curPos, writeStackPtr->location);
  2571.         size -= sizeof(MF3DSize);
  2572.  
  2573.         /* Binary objects are padded to four-byte boundaries */
  2574.         padding = 3 - (size + 3) % 4;
  2575.         
  2576.         result = MF3D_Uns32Write(metafile, size + padding);
  2577.     }
  2578.  
  2579.     if (result == kMF3DNoErr)
  2580.         result = MF3DSeekPosition(metafile, curPos);
  2581.  
  2582.     if (result == kMF3DNoErr)
  2583.     {    /* Pad the object as required */
  2584.         if (padding > 0)
  2585.         {    MF3DUns32    zero;
  2586.  
  2587.             zero = 0;
  2588.             result = MF3D_WriteProc(metafile, padding, &zero);
  2589.         }
  2590.     }
  2591.  
  2592.     if (result == kMF3DNoErr)
  2593.     {    metafile->writeStack = writeStackPtr->next;
  2594.         MF3D_Free(writeStackPtr);
  2595.     }
  2596.  
  2597.     return result;
  2598. }
  2599.  
  2600. /*==============================================================================
  2601.  *    MF3D_EndWriteT
  2602.  *
  2603.  *    Just write a closing parenthesis
  2604.  *==============================================================================
  2605.  */
  2606. MF3DErr
  2607. MF3D_EndWriteT(
  2608.     MF3D_FilePtr    metafile)
  2609. {
  2610.     MF3DErr    result;
  2611.  
  2612.     result = kMF3DNoErr;
  2613.  
  2614.     if (metafile->indent > 0)
  2615.         --metafile->indent;
  2616.     else
  2617.         result = kMF3DErrTooManyEndContainers;
  2618.  
  2619.     if (result == kMF3DNoErr)
  2620.     {    result = MF3D_WriteProc(metafile, strlen(kMF3D_EndCharStr " "),
  2621.                 kMF3D_EndCharStr " ");
  2622.     }
  2623.  
  2624.     return result;
  2625. }
  2626.  
  2627. /*==============================================================================
  2628.  *    MF3D_ObjTypeReadB
  2629.  *
  2630.  *    Read the objectType
  2631.  *==============================================================================
  2632.  */
  2633. MF3DErr
  2634. MF3D_ObjTypeReadB(
  2635.     MF3D_FilePtr        metafile,
  2636.     MF3D_ObjStuffPtr    *objStuff,
  2637.     MF3DObjType            *objType)
  2638. {
  2639.     MF3DErr    result;
  2640.     result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType), (char *)objType);
  2641.  
  2642.     if (result == kMF3DNoErr && objStuff != NULL)
  2643.         result = MF3D_FindObjectFromType(*objType, objStuff);
  2644.  
  2645.     return result;
  2646. }
  2647.  
  2648. /*==============================================================================
  2649.  *    MF3D_ObjTypeReadBS
  2650.  *
  2651.  *    Read the objectType and unswap
  2652.  *==============================================================================
  2653.  */
  2654. MF3DErr
  2655. MF3D_ObjTypeReadBS(
  2656.     MF3D_FilePtr        metafile,
  2657.     MF3D_ObjStuffPtr    *objStuff,
  2658.     MF3DObjType            *objType)
  2659. {
  2660.     MF3DErr    result;
  2661.     result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType), (char *)objType);
  2662.  
  2663.     if (result == kMF3DNoErr)
  2664.         MF3D_ByteSwap(sizeof(MF3DObjType), *objType);
  2665.  
  2666.     if (result == kMF3DNoErr)
  2667.         result = MF3D_FindObjectFromType(*objType, objStuff);
  2668.  
  2669.     return result;
  2670. }
  2671.  
  2672. /*==============================================================================
  2673.  *    MF3D_ObjTypeReadT
  2674.  *
  2675.  *    Read the object name and convert it to an objectType.
  2676.  *==============================================================================
  2677.  */
  2678. MF3DErr
  2679. MF3D_ObjTypeReadT(
  2680.     MF3D_FilePtr        metafile,
  2681.     MF3D_ObjStuffPtr    *objStuff,
  2682.     MF3DObjType            *objType)
  2683. {
  2684.     return MF3D_ReadObjectStuff(metafile, objStuff, objType);
  2685. }
  2686.  
  2687. /*==============================================================================
  2688.  *    MF3D_ObjTypeWriteB
  2689.  *
  2690.  *    Write the object type and return object stuff.
  2691.  *==============================================================================
  2692.  */
  2693. MF3DErr
  2694. MF3D_ObjTypeWriteB(
  2695.     MF3D_FilePtr        metafile,
  2696.     MF3DVoidObjPtr        object,
  2697.     MF3D_ObjStuffPtr    *objStuff)
  2698. {
  2699.     MF3DErr        result;
  2700.     MF3DObjType    objType;
  2701.  
  2702.     MFASSERT(sizeof(MF3DObjType) == sizeof(MF3DUns32));
  2703.  
  2704.     objType = object->objectType;
  2705.     result = MF3D_FindObjectFromType(objType, objStuff);
  2706.  
  2707.     if (result == kMF3DNoErr)
  2708.     {    if (objType == kMF3DObjUnknownType)
  2709.         {    result = MF3D_Uns32Write(metafile,
  2710.                     ((MF3DUnknownObjPtr)object)->realObjectType);
  2711.         }
  2712.         else
  2713.         {    /* If we have a writeable type, spit it out */
  2714.             if ((*objStuff)->name != NULL)
  2715.                 result = MF3D_Uns32Write(metafile, objType);
  2716.         }
  2717.     }
  2718.  
  2719.     return result;
  2720. }
  2721.  
  2722. /*==============================================================================
  2723.  *    MF3D_ObjTypeWriteT
  2724.  *
  2725.  *    Write the object name and return object stuff.
  2726.  *==============================================================================
  2727.  */
  2728. MF3DErr
  2729. MF3D_ObjTypeWriteT(
  2730.     MF3D_FilePtr        metafile,
  2731.     MF3DVoidObjPtr        object,
  2732.     MF3D_ObjStuffPtr    *objStuff)
  2733. {
  2734.     MF3DErr        result;
  2735.  
  2736.     result = MF3D_FindObjectFromType(object->objectType, objStuff);
  2737.  
  2738.     if (result == kMF3DNoErr)
  2739.     {    if (object->objectType == kMF3DObjUnknownType)
  2740.         {    result = MF3D_Int32Write(metafile,
  2741.                     ((MF3DUnknownObjPtr)object)->realObjectType);
  2742.         }
  2743.         else if ((*objStuff)->name != NULL)
  2744.         {    MF3D_ValidateWriteSize(metafile, strlen(data) + 1);
  2745.             result = MF3D_OutputText(metafile, "%s ", (*objStuff)->name);
  2746.         }
  2747.     }
  2748.  
  2749.     return result;
  2750. }
  2751.  
  2752. /*==============================================================================
  2753.  *    I/O Primitive Routines
  2754.  *    Reference
  2755.  *==============================================================================
  2756.  */
  2757. MF3DErr
  2758. MF3D_RefReadB(
  2759.     MF3D_FilePtr            metafile,
  2760.     MF3DPositionReference    *data)
  2761. {
  2762.     MF3DErr    result;
  2763.  
  2764.     result = MF3D_Uns64Read(metafile, &data->location.binary);
  2765.  
  2766.     return result;
  2767. }
  2768.  
  2769. MF3DErr
  2770. MF3D_RefReadT(
  2771.     MF3D_FilePtr            metafile,
  2772.     MF3DPositionReference    *data)
  2773. {
  2774.     return MF3D_ReadTextLabel(metafile, &data->location.text);
  2775. }
  2776.  
  2777. MF3DErr
  2778. MF3D_TOCRefWriteB(
  2779.     MF3D_FilePtr                metafile,
  2780.     MF3DPositionReferencePtr    data)
  2781. {
  2782.     MF3DUns64    zero;
  2783.     MF3DErr        result;
  2784.  
  2785.     MF3D_Unused(data);
  2786.     
  2787.     /* Always write 0 and backpatch later */
  2788.     SetInt64ToZero(zero);
  2789.  
  2790.     /* If it is a binary file, we will want to update the location later */
  2791.     result = MF3DTellPosition(metafile, &metafile->tocLocation);
  2792.  
  2793.     if (result == kMF3DNoErr)
  2794.         result = MF3D_Uns64Write(metafile, zero);
  2795.  
  2796.     return result;
  2797. }
  2798.  
  2799. MF3DErr
  2800. MF3D_TOCRefWriteT(
  2801.     MF3D_FilePtr                metafile,
  2802.     MF3DPositionReferencePtr    data)
  2803. {
  2804.     MF3DErr    result;
  2805.  
  2806.     /* Rare pessimism */
  2807.     result = kMF3DErrOutOfMemory;
  2808.  
  2809.     MFASSERT(metafile->tocStuff.tocLabelName == NULL);
  2810.  
  2811.     if (data == NULL)
  2812.     {    /* Write "nextTOC>" */
  2813.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_NoTOCPtrStr
  2814.                 kMF3D_ReferencePtrStr " ") + 2);
  2815.         metafile->tocStuff.tocLabelName =
  2816.                 MF3D_DuplicateCString(kMF3D_NoTOCPtrStr);
  2817.     }
  2818.     else if (MF3DIsTextFormat(data->format))
  2819.     {    MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  2820.         metafile->tocStuff.tocLabelName =
  2821.                 MF3D_DuplicateCString(data->location.text);
  2822.     }
  2823.     else
  2824.     {    /* Write "toc>" */
  2825.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_DefaultTOCPtrStr
  2826.                 kMF3D_ReferencePtrStr " ") + 2);
  2827.         metafile->tocStuff.tocLabelName =
  2828.                 MF3D_DuplicateCString(kMF3D_DefaultTOCPtrStr);
  2829.     }
  2830.  
  2831.     if (metafile->tocStuff.tocLabelName != NULL)
  2832.     {    result = MF3D_OutputText(metafile, "%s" kMF3D_ReferencePtrStr " ",
  2833.                 metafile->tocStuff.tocLabelName);
  2834.     }
  2835.  
  2836.     return result;
  2837. }
  2838.  
  2839. MF3DErr
  2840. MF3D_RefWriteB(
  2841.     MF3D_FilePtr            metafile,
  2842.     MF3D_TOCPosition        data)
  2843. {
  2844.     return MF3D_Uns64Write(metafile, data.location);
  2845. }
  2846.  
  2847. MF3DErr
  2848. MF3D_RefWriteT(
  2849.     MF3D_FilePtr            metafile,
  2850.     MF3D_TOCPosition        data)
  2851. {
  2852.     MFASSERT(data.name != NULL);
  2853.  
  2854.     MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  2855.     return MF3D_OutputText(metafile, "%s" kMF3D_ReferencePtrStr " ",
  2856.             data.name);
  2857. }
  2858.  
  2859. MF3DErr
  2860. MF3D_LabelWriteB(
  2861.     MF3D_FilePtr                metafile,
  2862.     MF3DReferenceInfoPtr        data,
  2863.     MF3DBinaryFilePosition        location,
  2864.     MF3DObjType                    type)
  2865. {
  2866.     MF3D_TOCReferencePtr    refPtr;
  2867.     MF3DUns32                refCount;
  2868.     MF3DReferenceID            refID;
  2869.     MF3DErr                    result;
  2870.  
  2871.     result = kMF3DNoErr;
  2872.     refPtr = metafile->tocStuff.references;
  2873.     /* Subtract 1 because numReferences was already incremented
  2874.      * by MF3D_LabelWrite
  2875.      */
  2876.     refCount = metafile->tocStuff.numReferences - 1;
  2877.     refID = data->refID;
  2878.     while (result == kMF3DNoErr && refCount > 0)
  2879.     {    if (refPtr->refID == refID)
  2880.             result = kMF3DErrTwoObjectsWithSameRefID;
  2881.         ++refPtr;
  2882.         --refCount;
  2883.     }
  2884.  
  2885.     if (result == kMF3DNoErr)
  2886.     {    refPtr->refID = refID;
  2887.         refPtr->ref.location = location;
  2888.         refPtr->type = type;
  2889.     }
  2890.  
  2891.     return result;
  2892. }
  2893.  
  2894. MF3DErr
  2895. MF3D_LabelWriteT(
  2896.     MF3D_FilePtr                metafile,
  2897.     MF3DReferenceInfoPtr        data,
  2898.     MF3DBinaryFilePosition        location,
  2899.     MF3DObjType                    type)
  2900. {
  2901.     MF3D_TOCReferencePtr    refPtr;
  2902.     MF3DUns32                refCount;
  2903.     MF3DReferenceID            refID;
  2904.     MF3DCStringPtr            refNameString;
  2905.     MF3DErr                    result;
  2906.  
  2907.     MF3D_Unused(location);
  2908.     MF3D_Unused(type);
  2909.  
  2910.     result = kMF3DNoErr;
  2911.  
  2912.     if (data->refName != NULL)
  2913.     {    MF3D_ValidateWriteSize(metafile, strlen(kMF3D_LabelCharStr " ") +
  2914.                 strlen(data->refName));
  2915.         result = MF3D_OutputText(metafile, "%s" kMF3D_LabelCharStr " ",
  2916.                 data->refName);
  2917.         if (result == kMF3DNoErr)
  2918.             refNameString = MF3D_DuplicateCString(data->refName);
  2919.     }
  2920.     else
  2921.     {    /* If no label exists, make one up */
  2922.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_DefaultLabelStr "%ld"
  2923.                 kMF3D_LabelCharStr " "));
  2924.         result = MF3D_OutputText(metafile, kMF3D_DefaultLabelStr "%ld"
  2925.                 kMF3D_LabelCharStr " ", data->refID);
  2926.         if (result == kMF3DNoErr)
  2927.         {    refNameString = MF3D_Malloc(kMF3D_MaxDefaultLabelLen);
  2928.             if (refNameString == NULL)
  2929.                 result = kMF3DErrOutOfMemory;
  2930.         }
  2931.         if (result == kMF3DNoErr)
  2932.         {    int    numChars;
  2933.  
  2934.             numChars = sprintf(refNameString, kMF3D_DefaultLabelStr "%ld"
  2935.                     kMF3D_LabelCharStr, data->refID);
  2936.             MFASSERT(numChars < kMF3D_MaxDefaultLabelLen);
  2937.             refNameString = MF3D_Realloc(refNameString, numChars + 1);
  2938.         }
  2939.     }
  2940.  
  2941.     if (result == kMF3DNoErr)
  2942.     {    /* Write a newline here */
  2943.         MF3D_WriteNewLine(metafile);
  2944.  
  2945.         refPtr = metafile->tocStuff.references;
  2946.         /* Subtract 1 because numReferences was already incremented
  2947.          * by MF3D_LabelWrite
  2948.          */
  2949.         refCount = metafile->tocStuff.numReferences - 1;
  2950.         refID = data->refID;
  2951.         while (result == kMF3DNoErr && refCount > 0)
  2952.         {    if (refPtr->refID == refID)
  2953.             {    result = kMF3DErrTwoObjectsWithSameRefID;
  2954.             }
  2955.             else if (MF3D_CmpStrInsensitive(refPtr->ref.name, refNameString) == 0)
  2956.             {    result = kMF3DErrTwoObjectsWithSameRefName;
  2957.             }
  2958.             ++refPtr;
  2959.             --refCount;
  2960.         }
  2961.  
  2962.         if (result == kMF3DNoErr)
  2963.         {    refPtr->refID = refID;
  2964.             refPtr->ref.name = refNameString;
  2965.             refPtr->type = type;
  2966.         }
  2967.         else
  2968.             MF3D_Free(refNameString);
  2969.     }
  2970.  
  2971.     return result;
  2972. }
  2973.  
  2974. /*==============================================================================
  2975.  *    Basic 3-D Types
  2976.  *    2-D Point
  2977.  *==============================================================================
  2978.  */
  2979. MF3DErr
  2980. MF3D_Point2DRead(
  2981.     MF3D_FilePtr    metafile,
  2982.     MF3DPoint2D        *point)
  2983. {
  2984.     MF3DErr    result;
  2985.  
  2986.     result = MF3D_Float32Read(metafile, &point->x);
  2987.  
  2988.     if (result == kMF3DNoErr)
  2989.         result = MF3D_Float32Read(metafile, &point->y);
  2990.  
  2991.     return result;
  2992. }
  2993.  
  2994. MF3DErr
  2995. MF3D_Point2DWrite(
  2996.     MF3D_FilePtr    metafile,
  2997.     MF3DPoint2D        point)
  2998. {
  2999.     MF3DErr    result;
  3000.  
  3001.     result = MF3D_Float32Write(metafile, point.x);
  3002.  
  3003.     if (result == kMF3DNoErr)
  3004.         result = MF3D_Float32Write(metafile, point.y);
  3005.  
  3006.     return result;
  3007. }
  3008.  
  3009. /*==============================================================================
  3010.  *    Basic 3-D Types
  3011.  *    3-D Point
  3012.  *==============================================================================
  3013.  */
  3014. MF3DErr
  3015. MF3D_Point3DRead(
  3016.     MF3D_FilePtr    metafile,
  3017.     MF3DPoint3D        *point)
  3018. {
  3019.     MF3DErr    result;
  3020.  
  3021.     result = MF3D_Float32Read(metafile, &point->x);
  3022.  
  3023.     if (result == kMF3DNoErr)
  3024.         result = MF3D_Float32Read(metafile, &point->y);
  3025.  
  3026.     if (result == kMF3DNoErr)
  3027.         result = MF3D_Float32Read(metafile, &point->z);
  3028.  
  3029.     return result;
  3030. }
  3031.  
  3032. MF3DErr
  3033. MF3D_Point3DWrite(
  3034.     MF3D_FilePtr    metafile,
  3035.     MF3DPoint3D        point)
  3036. {
  3037.     MF3DErr    result;
  3038.  
  3039.     result = MF3D_Float32Write(metafile, point.x);
  3040.  
  3041.     if (result == kMF3DNoErr)
  3042.         result = MF3D_Float32Write(metafile, point.y);
  3043.  
  3044.     if (result == kMF3DNoErr)
  3045.         result = MF3D_Float32Write(metafile, point.z);
  3046.  
  3047.     return result;
  3048. }
  3049.  
  3050. /*==============================================================================
  3051.  *    Basic 3-D Types
  3052.  *    Rational 3-D Point
  3053.  *==============================================================================
  3054.  */
  3055. MF3DErr
  3056. MF3D_RationalPoint3DRead(
  3057.     MF3D_FilePtr        metafile,
  3058.     MF3DRationalPoint3D    *point)
  3059. {
  3060.     MF3DErr    result;
  3061.  
  3062.     result = MF3D_Float32Read(metafile, &point->x);
  3063.  
  3064.     if (result == kMF3DNoErr)
  3065.         result = MF3D_Float32Read(metafile, &point->y);
  3066.  
  3067.     if (result == kMF3DNoErr)
  3068.         result = MF3D_Float32Read(metafile, &point->w);
  3069.  
  3070.     return result;
  3071. }
  3072.  
  3073. MF3DErr
  3074. MF3D_RationalPoint3DWrite(
  3075.     MF3D_FilePtr        metafile,
  3076.     MF3DRationalPoint3D    point)
  3077. {
  3078.     MF3DErr    result;
  3079.  
  3080.     result = MF3D_Float32Write(metafile, point.x);
  3081.  
  3082.     if (result == kMF3DNoErr)
  3083.         result = MF3D_Float32Write(metafile, point.y);
  3084.  
  3085.     if (result == kMF3DNoErr)
  3086.         result = MF3D_Float32Write(metafile, point.w);
  3087.  
  3088.     return result;
  3089. }
  3090.  
  3091. /*==============================================================================
  3092.  *    Basic 3-D Types
  3093.  *    Rational 4-D Point
  3094.  *==============================================================================
  3095.  */
  3096. MF3DErr
  3097. MF3D_RationalPoint4DRead(
  3098.     MF3D_FilePtr        metafile,
  3099.     MF3DRationalPoint4D    *point)
  3100. {
  3101.     MF3DErr    result;
  3102.  
  3103.     result = MF3D_Float32Read(metafile, &point->x);
  3104.  
  3105.     if (result == kMF3DNoErr)
  3106.         result = MF3D_Float32Read(metafile, &point->y);
  3107.  
  3108.     if (result == kMF3DNoErr)
  3109.         result = MF3D_Float32Read(metafile, &point->z);
  3110.  
  3111.     if (result == kMF3DNoErr)
  3112.         result = MF3D_Float32Read(metafile, &point->w);
  3113.  
  3114.     return result;
  3115. }
  3116.  
  3117. MF3DErr
  3118. MF3D_RationalPoint4DWrite(
  3119.     MF3D_FilePtr        metafile,
  3120.     MF3DRationalPoint4D    point)
  3121. {
  3122.     MF3DErr    result;
  3123.  
  3124.     result = MF3D_Float32Write(metafile, point.x);
  3125.  
  3126.     if (result == kMF3DNoErr)
  3127.         result = MF3D_Float32Write(metafile, point.y);
  3128.  
  3129.     if (result == kMF3DNoErr)
  3130.         result = MF3D_Float32Write(metafile, point.z);
  3131.  
  3132.     if (result == kMF3DNoErr)
  3133.         result = MF3D_Float32Write(metafile, point.w);
  3134.  
  3135.     return result;
  3136. }
  3137.  
  3138. /*==============================================================================
  3139.  *    Basic 3-D Types
  3140.  *    3-D Vector
  3141.  *==============================================================================
  3142.  */
  3143. MF3DErr
  3144. MF3D_Vector3DRead(
  3145.     MF3D_FilePtr    metafile,
  3146.     MF3DVector3D    *vector)
  3147. {
  3148.     MF3DErr    result;
  3149.  
  3150.     result = MF3D_Float32Read(metafile, &vector->x);
  3151.  
  3152.     if (result == kMF3DNoErr)
  3153.         result = MF3D_Float32Read(metafile, &vector->y);
  3154.  
  3155.     if (result == kMF3DNoErr)
  3156.         result = MF3D_Float32Read(metafile, &vector->z);
  3157.  
  3158.     return result;
  3159. }
  3160.  
  3161. MF3DErr
  3162. MF3D_Vector3DWrite(
  3163.     MF3D_FilePtr    metafile,
  3164.     MF3DVector3D    vector)
  3165. {
  3166.     MF3DErr    result;
  3167.  
  3168.     result = MF3D_Float32Write(metafile, vector.x);
  3169.  
  3170.     if (result == kMF3DNoErr)
  3171.         result = MF3D_Float32Write(metafile, vector.y);
  3172.  
  3173.     if (result == kMF3DNoErr)
  3174.         result = MF3D_Float32Write(metafile, vector.z);
  3175.  
  3176.     return result;
  3177. }
  3178.  
  3179. /*==============================================================================
  3180.  *    Basic 3-D Types
  3181.  *    Quaternion
  3182.  *==============================================================================
  3183.  */
  3184. MF3DErr
  3185. MF3D_QuaternionRead(
  3186.     MF3D_FilePtr        metafile,
  3187.     MF3DQuaternion        *quaternion)
  3188. {
  3189.     MF3DErr    result;
  3190.  
  3191.     result = MF3D_Float32Read(metafile, &quaternion->w);
  3192.  
  3193.     if (result == kMF3DNoErr)
  3194.         result = MF3D_Float32Read(metafile, &quaternion->x);
  3195.  
  3196.     if (result == kMF3DNoErr)
  3197.         result = MF3D_Float32Read(metafile, &quaternion->y);
  3198.  
  3199.     if (result == kMF3DNoErr)
  3200.         result = MF3D_Float32Read(metafile, &quaternion->z);
  3201.  
  3202.     return result;
  3203. }
  3204.  
  3205. MF3DErr
  3206. MF3D_QuaternionWrite(
  3207.     MF3D_FilePtr    metafile,
  3208.     MF3DQuaternion    quaternion)
  3209. {
  3210.     MF3DErr    result;
  3211.  
  3212.     result = MF3D_Float32Write(metafile, quaternion.w);
  3213.  
  3214.     if (result == kMF3DNoErr)
  3215.         result = MF3D_Float32Write(metafile, quaternion.x);
  3216.  
  3217.     if (result == kMF3DNoErr)
  3218.         result = MF3D_Float32Write(metafile, quaternion.y);
  3219.  
  3220.     if (result == kMF3DNoErr)
  3221.         result = MF3D_Float32Write(metafile, quaternion.z);
  3222.  
  3223.     return result;
  3224. }
  3225.  
  3226. /*==============================================================================
  3227.  *    Basic 3-D Types
  3228.  *    3x3 Matrix
  3229.  *==============================================================================
  3230.  */
  3231. MF3DErr
  3232. MF3D_Matrix3x3Read(
  3233.     MF3D_FilePtr        metafile,
  3234.     MF3DMatrix3x3        matrix)
  3235. {
  3236.     MF3DErr    result;
  3237.  
  3238.     result = MF3D_Float32Read(metafile, &matrix[0][0]);
  3239.     if (result == kMF3DNoErr)
  3240.         result = MF3D_Float32Read(metafile, &matrix[0][1]);
  3241.     if (result == kMF3DNoErr)
  3242.         result = MF3D_Float32Read(metafile, &matrix[0][2]);
  3243.     if (result == kMF3DNoErr)
  3244.         result = MF3D_Float32Read(metafile, &matrix[1][0]);
  3245.     if (result == kMF3DNoErr)
  3246.         result = MF3D_Float32Read(metafile, &matrix[1][1]);
  3247.     if (result == kMF3DNoErr)
  3248.         result = MF3D_Float32Read(metafile, &matrix[1][2]);
  3249.     if (result == kMF3DNoErr)
  3250.         result = MF3D_Float32Read(metafile, &matrix[2][0]);
  3251.     if (result == kMF3DNoErr)
  3252.         result = MF3D_Float32Read(metafile, &matrix[2][1]);
  3253.     if (result == kMF3DNoErr)
  3254.         result = MF3D_Float32Read(metafile, &matrix[2][2]);
  3255.  
  3256.     return result;
  3257. }
  3258.  
  3259. MF3DErr
  3260. MF3D_Matrix3x3Write(
  3261.     MF3D_FilePtr        metafile,
  3262.     MF3DConstMatrix3x3    matrix)
  3263. {
  3264.     MF3DErr    result;
  3265.  
  3266.     result = MF3D_Float32Write(metafile, matrix[0][0]);
  3267.     if (result == kMF3DNoErr)
  3268.         result = MF3D_Float32Write(metafile, matrix[0][1]);
  3269.     if (result == kMF3DNoErr)
  3270.         result = MF3D_Float32Write(metafile, matrix[0][2]);
  3271.  
  3272.     if (result == kMF3DNoErr)
  3273.         MF3D_WriteNewLine(metafile);
  3274.  
  3275.     if (result == kMF3DNoErr)
  3276.         result = MF3D_Float32Write(metafile, matrix[1][0]);
  3277.     if (result == kMF3DNoErr)
  3278.         result = MF3D_Float32Write(metafile, matrix[1][1]);
  3279.     if (result == kMF3DNoErr)
  3280.         result = MF3D_Float32Write(metafile, matrix[1][2]);
  3281.  
  3282.     if (result == kMF3DNoErr)
  3283.         MF3D_WriteNewLine(metafile);
  3284.  
  3285.     if (result == kMF3DNoErr)
  3286.         result = MF3D_Float32Write(metafile, matrix[2][0]);
  3287.     if (result == kMF3DNoErr)
  3288.         result = MF3D_Float32Write(metafile, matrix[2][1]);
  3289.     if (result == kMF3DNoErr)
  3290.         result = MF3D_Float32Write(metafile, matrix[2][2]);
  3291.  
  3292.     if (result == kMF3DNoErr)
  3293.         MF3D_WriteNewLine(metafile);
  3294.  
  3295.     return result;
  3296. }
  3297.  
  3298. /*==============================================================================
  3299.  *    Basic 3-D Types
  3300.  *    4x4 Matrix
  3301.  *==============================================================================
  3302.  */
  3303. MF3DErr
  3304. MF3D_Matrix4x4Read(
  3305.     MF3D_FilePtr        metafile,
  3306.     MF3DMatrix4x4        matrix)
  3307. {
  3308.     MF3DErr    result;
  3309.  
  3310.     result = MF3D_Float32Read(metafile, &matrix[0][0]);
  3311.     if (result == kMF3DNoErr)
  3312.         result = MF3D_Float32Read(metafile, &matrix[0][1]);
  3313.     if (result == kMF3DNoErr)
  3314.         result = MF3D_Float32Read(metafile, &matrix[0][2]);
  3315.     if (result == kMF3DNoErr)
  3316.         result = MF3D_Float32Read(metafile, &matrix[0][3]);
  3317.     if (result == kMF3DNoErr)
  3318.         result = MF3D_Float32Read(metafile, &matrix[1][0]);
  3319.     if (result == kMF3DNoErr)
  3320.         result = MF3D_Float32Read(metafile, &matrix[1][1]);
  3321.     if (result == kMF3DNoErr)
  3322.         result = MF3D_Float32Read(metafile, &matrix[1][2]);
  3323.     if (result == kMF3DNoErr)
  3324.         result = MF3D_Float32Read(metafile, &matrix[1][3]);
  3325.     if (result == kMF3DNoErr)
  3326.         result = MF3D_Float32Read(metafile, &matrix[2][0]);
  3327.     if (result == kMF3DNoErr)
  3328.         result = MF3D_Float32Read(metafile, &matrix[2][1]);
  3329.     if (result == kMF3DNoErr)
  3330.         result = MF3D_Float32Read(metafile, &matrix[2][2]);
  3331.     if (result == kMF3DNoErr)
  3332.         result = MF3D_Float32Read(metafile, &matrix[2][3]);
  3333.     if (result == kMF3DNoErr)
  3334.         result = MF3D_Float32Read(metafile, &matrix[3][0]);
  3335.     if (result == kMF3DNoErr)
  3336.         result = MF3D_Float32Read(metafile, &matrix[3][1]);
  3337.     if (result == kMF3DNoErr)
  3338.         result = MF3D_Float32Read(metafile, &matrix[3][2]);
  3339.     if (result == kMF3DNoErr)
  3340.         result = MF3D_Float32Read(metafile, &matrix[3][3]);
  3341.  
  3342.     return result;
  3343. }
  3344.  
  3345. MF3DErr
  3346. MF3D_Matrix4x4Write(
  3347.     MF3D_FilePtr        metafile,
  3348.     MF3DConstMatrix4x4    matrix)
  3349. {
  3350.     MF3DErr    result;
  3351.  
  3352.     result = MF3D_Float32Write(metafile, matrix[0][0]);
  3353.     if (result == kMF3DNoErr)
  3354.         result = MF3D_Float32Write(metafile, matrix[0][1]);
  3355.     if (result == kMF3DNoErr)
  3356.         result = MF3D_Float32Write(metafile, matrix[0][2]);
  3357.     if (result == kMF3DNoErr)
  3358.         result = MF3D_Float32Write(metafile, matrix[0][3]);
  3359.  
  3360.     if (result == kMF3DNoErr)
  3361.         MF3D_WriteNewLine(metafile);
  3362.  
  3363.     if (result == kMF3DNoErr)
  3364.         result = MF3D_Float32Write(metafile, matrix[1][0]);
  3365.     if (result == kMF3DNoErr)
  3366.         result = MF3D_Float32Write(metafile, matrix[1][1]);
  3367.     if (result == kMF3DNoErr)
  3368.         result = MF3D_Float32Write(metafile, matrix[1][2]);
  3369.     if (result == kMF3DNoErr)
  3370.         result = MF3D_Float32Write(metafile, matrix[1][3]);
  3371.  
  3372.     if (result == kMF3DNoErr)
  3373.         MF3D_WriteNewLine(metafile);
  3374.  
  3375.     if (result == kMF3DNoErr)
  3376.         result = MF3D_Float32Write(metafile, matrix[2][0]);
  3377.     if (result == kMF3DNoErr)
  3378.         result = MF3D_Float32Write(metafile, matrix[2][1]);
  3379.     if (result == kMF3DNoErr)
  3380.         result = MF3D_Float32Write(metafile, matrix[2][2]);
  3381.     if (result == kMF3DNoErr)
  3382.         result = MF3D_Float32Write(metafile, matrix[2][3]);
  3383.  
  3384.     if (result == kMF3DNoErr)
  3385.         MF3D_WriteNewLine(metafile);
  3386.  
  3387.     if (result == kMF3DNoErr)
  3388.         result = MF3D_Float32Write(metafile, matrix[3][0]);
  3389.     if (result == kMF3DNoErr)
  3390.         result = MF3D_Float32Write(metafile, matrix[3][1]);
  3391.     if (result == kMF3DNoErr)
  3392.         result = MF3D_Float32Write(metafile, matrix[3][2]);
  3393.     if (result == kMF3DNoErr)
  3394.         result = MF3D_Float32Write(metafile, matrix[3][3]);
  3395.  
  3396.     if (result == kMF3DNoErr)
  3397.         MF3D_WriteNewLine(metafile);
  3398.  
  3399.     return result;
  3400. }
  3401.  
  3402. /*==============================================================================
  3403.  *    Basic 3-D Types
  3404.  *    RGB Color
  3405.  *==============================================================================
  3406.  */
  3407. MF3DErr
  3408. MF3D_RGBColorRead(
  3409.     MF3D_FilePtr        metafile,
  3410.     MF3DRGBColor        *color)
  3411. {
  3412.     MF3DErr    result;
  3413.  
  3414.     result = MF3D_Float32Read(metafile, &color->red);
  3415.  
  3416.     if (result == kMF3DNoErr)
  3417.         result = MF3D_Float32Read(metafile, &color->green);
  3418.  
  3419.     if (result == kMF3DNoErr)
  3420.         result = MF3D_Float32Read(metafile, &color->blue);
  3421.  
  3422.     return result;
  3423. }
  3424.  
  3425. MF3DErr
  3426. MF3D_RGBColorWrite(
  3427.     MF3D_FilePtr    metafile,
  3428.     MF3DRGBColor    color)
  3429. {
  3430.     MF3DErr    result;
  3431.  
  3432.     result = MF3D_Float32Write(metafile, color.red);
  3433.  
  3434.     if (result == kMF3DNoErr)
  3435.         result = MF3D_Float32Write(metafile, color.green);
  3436.  
  3437.     if (result == kMF3DNoErr)
  3438.         result = MF3D_Float32Write(metafile, color.blue);
  3439.  
  3440.     return result;
  3441. }
  3442.  
  3443. /*==============================================================================
  3444.  *    Basic 3-D Types
  3445.  *    2-D Parametrization
  3446.  *==============================================================================
  3447.  */
  3448. MF3DErr
  3449. MF3D_Param2DRead(
  3450.     MF3D_FilePtr        metafile,
  3451.     MF3DParam2D            *param)
  3452. {
  3453.     MF3DErr    result;
  3454.  
  3455.     result = MF3D_Float32Read(metafile, ¶m->u);
  3456.  
  3457.     if (result == kMF3DNoErr)
  3458.         result = MF3D_Float32Read(metafile, ¶m->v);
  3459.  
  3460.     return result;
  3461. }
  3462.  
  3463. MF3DErr
  3464. MF3D_Param2DWrite(
  3465.     MF3D_FilePtr    metafile,
  3466.     MF3DParam2D        param)
  3467. {
  3468.     MF3DErr    result;
  3469.  
  3470.     result = MF3D_Float32Write(metafile, param.u);
  3471.  
  3472.     if (result == kMF3DNoErr)
  3473.         result = MF3D_Float32Write(metafile, param.v);
  3474.  
  3475.     return result;
  3476. }
  3477.  
  3478. /*==============================================================================
  3479.  *    Comment Routines
  3480.  *==============================================================================
  3481.  */
  3482. MF3DErr
  3483. MF3D_CommentStrWrite(
  3484.     MF3D_FilePtr    metafile,
  3485.     const char        *data)
  3486. {
  3487.     MF3DErr    result;
  3488.  
  3489.     result = kMF3DNoErr;
  3490.  
  3491.     if (MF3DIsTextFormat(metafile->dataFormat))
  3492.     {    MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  3493.         result = MF3D_OutputText(metafile, kMF3D_CommentLineStr " %s", data);
  3494.  
  3495.         if (result == kMF3DNoErr)
  3496.             result = MF3D_WriteNewLine(metafile);
  3497.     }
  3498.  
  3499.     return result;
  3500. }
  3501.  
  3502. MF3DErr
  3503. MF3D_CommentNumWrite(
  3504.     MF3D_FilePtr    metafile,
  3505.     MF3DInt32        data)
  3506. {
  3507.     MF3DErr    result;
  3508.  
  3509.     result = kMF3DNoErr;
  3510.  
  3511.     if (MF3DIsTextFormat(metafile->dataFormat))
  3512.     {    MF3D_ValidateWriteSize(metafile, 2);
  3513.         result = MF3D_OutputText(metafile, kMF3D_CommentLineStr " ");
  3514.  
  3515.         if (result == kMF3DNoErr)
  3516.             result = MF3D_Int32Write(metafile, data);
  3517.  
  3518.         if (result == kMF3DNoErr)
  3519.             result = MF3D_WriteNewLine(metafile);
  3520.     }
  3521.  
  3522.     return result;
  3523. }
  3524.  
  3525. /*==============================================================================
  3526.  *    MF3D_PositionReferenceDisposer
  3527.  *
  3528.  *    Dispose a PositionReferencePtr
  3529.  *==============================================================================
  3530.  */
  3531. MF3DErr
  3532. MF3D_PositionReferenceDisposer(
  3533.     MF3DConstPositionReferencePtr    inPosRef)
  3534. {
  3535.     if (inPosRef != NULL && MF3DIsTextFormat(inPosRef->format) &&
  3536.             inPosRef->location.text != NULL)
  3537.     {    MF3D_Free(inPosRef->location.text);
  3538.     }
  3539.  
  3540.     return kMF3DNoErr;
  3541. }
  3542.  
  3543. /*==============================================================================
  3544.  *    MF3D_VariableUnsRead
  3545.  *
  3546.  *    Read an unsigned number from a variable-sized array and store it into
  3547.  *    an Uns32.
  3548.  *==============================================================================
  3549.  */
  3550. MF3DErr
  3551. MF3D_VariableUnsRead(
  3552.     MF3D_FilePtr    inMetafilePtr,
  3553.     MF3DUns32        inMaxValue,
  3554.     MF3DUns32Ptr    outValue)
  3555. {
  3556.     MF3DErr    result;
  3557.  
  3558. #if kAllowVariableUns == TRUE
  3559.     if (inMaxValue >= 65536)
  3560. #endif
  3561.         result = MF3D_Uns32Read(inMetafilePtr, outValue);
  3562. #if kAllowVariableUns == TRUE
  3563.     else if (inMaxValue >= 256)
  3564.     {    MF3DUns16    tempValue;
  3565.         result = MF3D_Uns16Read(inMetafilePtr, &tempValue);
  3566.         if (result == kMF3DNoErr)
  3567.             *outValue = tempValue;
  3568.     }
  3569.     else
  3570.     {    MF3DUns8    tempValue;
  3571.         result = MF3D_Uns8Read(inMetafilePtr, &tempValue);
  3572.         if (result == kMF3DNoErr)
  3573.             *outValue = tempValue;
  3574.     }
  3575. #endif
  3576.  
  3577.     return result;
  3578. }
  3579.  
  3580. /*==============================================================================
  3581.  *    MF3D_VariableUnsWrite
  3582.  *
  3583.  *    Write an unsigned number to a variable-sized array.
  3584.  *==============================================================================
  3585.  */
  3586. MF3DErr
  3587. MF3D_VariableUnsWrite(
  3588.     MF3D_FilePtr    inMetafilePtr,
  3589.     MF3DUns32        inMaxValue,
  3590.     MF3DUns32        inValue)
  3591. {
  3592.     MF3DErr    result;
  3593.  
  3594.     MFASSERT(inValue <= inMaxValue);
  3595.  
  3596. #if kAllowVariableUns == TRUE
  3597.     if (inMaxValue >= 65536)
  3598. #endif
  3599.         result = MF3D_Uns32Write(inMetafilePtr, inValue);
  3600. #if kAllowVariableUns == TRUE
  3601.     else if (inMaxValue >= 256)
  3602.         result = MF3D_Uns16Write(inMetafilePtr, (MF3DUns16)inValue);
  3603.     else
  3604.         result = MF3D_Uns8Write(inMetafilePtr, (MF3DUns8)inValue);
  3605. #endif
  3606.  
  3607.     return result;
  3608. }
  3609.